如何从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' } ] }] 

我试图执行一个基于petsForSaleseekingPets返回匹配用户的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.findsearch它。 两条评论线是我尝试过没有成功的。 我也试着将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。