Node.js 查询嵌套数组
我有下面的用户文档。我想返回friends.name等于Bob的所有“friends”的列表Node.js 查询嵌套数组,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有下面的用户文档。我想返回friends.name等于Bob的所有“friends”的列表 { "_id" : ObjectId("5a4be9f200471a49d2e23ce4"), "name": "James" "friends" : [ { "_id" : ObjectId("5a4be9f200471a49d2e23ce6"), "dob" : ISODate("2018-01-02T00:0
{
"_id" : ObjectId("5a4be9f200471a49d2e23ce4"),
"name": "James"
"friends" : [
{
"_id" : ObjectId("5a4be9f200471a49d2e23ce6"),
"dob" : ISODate("2018-01-02T00:00:00.000Z"),
"name" : "Bob"
},
{
"_id" : ObjectId("5a4be9f200471a49d2e23ce5"),
"dob" : ISODate("2018-01-02T00:00:00.000Z"),
"name" : "Fred"
}
],
"__v" : 0
}
当我尝试使用下面的查询时,它会工作,但会返回整个好友列表,而不仅仅是Bob
User.findOne({ "friends.name": "Bob" }, function(err, friends) {
if(err) return next(err);
res.send(friends);
});
我如何查询以便只返回Bob对象而不返回Fred 您的查询是正确的,但它返回至少有一个朋友符合您的条件的所有用户文档 如果您只想从friends集合中找到匹配的项目,您可以这样做
db.User.aggregate([
{ $unwind: "$friends" },
{ $replaceRoot: { newRoot: "$friends" } },
{ $match: { name: "Bob" }}
])
可以使用在数组中输出匹配元素来简化可能的重复。类似于b.User.find{friends.name:Bob},{u id:0,friends:{$elemMatch:{name:Bob};。$elemMatch投影仅返回数组中的第一个匹配元素。如果用户有多个名为Bob的朋友,您将只看到第一个。此外,这样您就不会返回朋友,而是返回用户实体的friends属性。