【问题标题】:Query nested array查询嵌套数组
【发布时间】:2018-06-13 13:20:16
【问题描述】:

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

{
    "_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?

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案1】:

您的查询是正确的,但它返回所有用户文档至少有一个朋友符合您的条件。

如果您只想匹配朋友收藏中的项目,您可以这样做。

db.User.aggregate([
  { $unwind: "$friends" },
  { $replaceRoot: { newRoot: "$friends" } },
  { $match: { name: "Bob" }}
])

【讨论】:

  • 这可以简化为使用$elemMatch(projection)输出数组中的匹配元素。类似db.User.find( {"friends.name": "Bob"}, {"_id": 0, "friends": {"$elemMatch": {"name": "Bob"}}});.
  • $elemMatch 投影仅返回数组中的第一个匹配元素。如果用户有多个名为 Bob 的朋友,您将只看到第一个。而且,这样你返回的不是朋友,而是 User 实体的friends 属性。
猜你喜欢
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多