如何从MongoDB中的另一个数组中search一个数组?
我有一个users
表具有以下数据结构:
[{ userID: 0, username: 'test0', petsForSale: [ { type: 'fish' }, { type: 'cats' } ], seekingPets: [ { type: 'dogs' }, { type: 'birds' } ] }, { userID: 1, username: 'test1', petsForSale: [ { type: 'guinea pigs' }, { type: 'dogs' }, { type: 'hamsters' } ], seekingPets: [ { type: 'ferrets' } ] }]
我试图执行一个基于petsForSale
和seekingPets
返回匹配用户的GET
。 例如,如果用户正在销售dogs
,则他们将出现在具有正在seekingPets
dogs
任何用户的匹配结果的列表中。 我非常接近,这是我的路由器代码到目前为止:
router.get('/:id/findmatches', function(req, res) { var db = req.db; var collection = db.get('users'); var uid = req.params.id; //var seeking_pets = collection.find({ userID: uid }, { seekingPets: 1 }); //var seeking_pets = collection.find({ userID: uid }, { seekingPets: { type: 1 }}); var seeking_pets = [ 'dogs', 'birds' ]; // *Hard-coded is the only way I can get it to work collection.find({ petsForSale: { $elemMatch: { type: { $in: seeking_pets }}}}, function(e, docs) { res.json(docs); }); });
这个代码编译和工作正常与seeking_pets
硬编码 – 访问/users/0/findmatches
返回用户test1
按预期。 我坚持从请求中的userID
中提取seekingPets
的列表,并在collection.find
search它。 两条评论线是我尝试过没有成功的。 我也试着将collection
转换为array
。
由于find
是一个asynchronous方法,所以必须实现一个callback以获取从数据库返回的值。 另请注意,您的硬编码值是string,但seekPets数组是由对象组成的。
尝试这个:
router.get('/:id/findmatches', function(req, res) { var db = req.db; var collection = db.get('users'); var uid = req.params.id; collection.findOne({ userID: uid }, function(err, user) var seeking_pets = []. for (var i = 0; i < user.seekingPets.length; i++) { seeking_pets.push(user.seekingPets[i].type); } collection.find({ petsForSale: { $elemMatch: { type: { $in: seeking_pets }}}}, function(e, docs) { res.json(docs); }); }); });
请注意,我使用findOne
来获得一个对象,而不是一个数组,从这个对象我得到seekingPets数组。 当然,你可以改进这个代码,消除一些可有可无的variables,如seeking_pets
并处理数据库错误,如果没有findid。