Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 查询嵌套数组_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 查询嵌套数组

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

我有下面的用户文档。我想返回friends.name等于Bob的所有“friends”的列表

{
    "_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属性。