【问题标题】:Select a field by filter base on nest and sub nest document like Post->Comment->Likes using mongo通过基于嵌套和子嵌套文档的过滤器选择一个字段,例如使用 mongo 的 Post->Comment->Likes
【发布时间】:2020-02-15 07:55:13
【问题描述】:
{
    "_id" : ObjectId("5da7c114753c6202f4f4d3b2"),

    "image" : "hem sopheap-1571275028119.jpg",
    "body" : "my first post\r\nyes this my post",
    "date" : ISODate("2019-10-17T00:59:18.901Z"),
    "comments" : [ 
        {
            "user" : "5d999578aeb073247de4bd6e",
            "fullname" : "hem sopheap",
            "username" : "sopheap",
            "comment" : "My first comment",
            "_id" : ObjectId("5da7c125753c6202f4f4d3b4"),
            "replies" : []
        }, 
        {
            "user" : "5da85558886aee13e4e7f044",
            "fullname" : "soeng kanel",
            "username" : "",
            "comment" : "Mr. kansael comment",
            "_id" : ObjectId("5da8557f886aee13e4e7f045"),
            "replies" : [],
            "date" : ISODate("2019-10-17T10:10:37.394Z"),
            "likes" : [ 
             "5d999578aeb073247de4bd6e", 
             "5d999578aeb073247de4bd6f"
            ]
        }
    ],
    "__v" : 41,
    "likes" : [ 
            "5d999578aeb073247de4bd6e", 
            "5d999578aeb073247de4bd6p"
        ]
}

我想获取特定comments 的所有likes,而不是post SQL语句中类似这样的东西:

db.posts.find({
  "comments": {
    $elemMatch: {
      "_id": ObjectId("5da8557f886aee13e4e7f045")
    }
  }
}, {
  likes:"$comments", _id:0
}).pretty()

预期的结果应该是这样的

"likes" : [ "5d999578aeb073247de4bd6e", "5d999578aeb073247de4bd6f" ]

【问题讨论】:

    标签: node.js mongodb express mongoose mongodb-query


    【解决方案1】:

    了解$elemMatch

    这是为您准备的完整查询

    db.posts.find({
      "comments": {
        $elemMatch: {
          "user": "5da85558886aee13e4e7f044",
          "_id": ObjectId("5da8557f886aee13e4e7f045")
        }
      }
    }, {
      likes:"$comments.likes", _id:0
    }).pretty()

    说明:

    当基于数组子文档的多个字段进行过滤时,人们常犯的一个错误是简单地执行类似{"comments._id": "something", "comments.user": "something"} 的操作,它返回数组子文档的所有项,只要某些项与 id、user 匹配。这个问题的解决方法是$elemMatch

    【讨论】:

    • 我已更新查询以按照您的要求格式化输出 likes: [id]。你得到正确的结果了吗?附言如果这可以帮助您解决问题,请点赞。如果这解决了问题,请接受答案。
    • 但是点赞很多或者元素很多,我只能从你的查询中得到一个赞。可以帮助更多,获取likes下的元素列表,可以帮助检查我的示例输入数据。
    猜你喜欢
    • 2021-01-16
    • 1970-01-01
    • 2021-03-28
    • 2020-07-17
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多