【问题标题】:See if nested array of objects contains value | MongoDB查看嵌套的对象数组是否包含值 | MongoDB
【发布时间】:2021-10-01 12:37:16
【问题描述】:

我有一个集合posts,其中有一个对象数组comments。在这个对象数组中,我还有另一个对象数组likes

我正在尝试编写一个查询,该查询从帖子中提取最近的 5 个 cmets,并且仅根据用户是否已经喜欢该评论来提取 truefalse for likes

到目前为止我已经写了这个:

db.posts.aggregate([
    {
        "$match": {
            "_id": postId
        }
    },
    {
        "$project": 
        {
            "comments": {
                "$slice": [ "$comments", -5 ]
            }
        }
    },
    {
        "$project": {
            "comments.content": 1,
            "comments.likes": { 
                "$eq":  [ "comments.likes.$.createdBy.username", username ] 
            } 
        }
    }
])

但这似乎每次都拉false

是否可以这样做而无需编写单独的查询来检查用户是否喜欢?

编辑:所以对于以下文档:

username = "testusername"postId = "60fcd335abbe5a73583b69f0"

我希望输出:

[
    {
        "content": "test comment",
        "likes": true
    },
    {
        "content": "another test comment",
        "likes": true
    }
]

username = "testusername2" 我希望输出

[
    {
        "content": "test comment",
        "likes": true
    },
    {
        "content": "another test comment",
        "likes": false
    }
]

回答

感谢@ray 为您提供的帮助。 Condensed Code Here 虽然请参阅 ray 对代码拆分的响应,并附有解释。

【问题讨论】:

  • 如果你能提供样本数据和预期输出给这里的每个人看看会很有帮助
  • 另一条建议:将代码/示例数据粘贴为文本而不是图像;其他人会更容易复制和复制它

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

您可以使用$map 逐层处理您的数组。

  1. 您可以先$map 发表评论以预测用户1 是否喜欢的布尔值
  2. 然后您可以使用$anyElementTrue 对投影布尔值进行检查

这里是 Mongo playground 来展示这个想法(对您的示例进行了一些小的修改)。您可以修改它以满足您的需要。

【讨论】:

  • 这是完美的。以前没有使用过$map,所以感谢您,感谢您将 Mongo 游乐场带入我的生活。
  • 仅供参考,以避免第二次投影:Mongo Playground
  • @bourkison 你的新代码更干净。我将代码分成 2 个阶段的原因是出于演示目的,因此您可以单独运行这些阶段以便更好地理解。我建议您在问题中补充您的新版本,以帮助更多人:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 2012-07-23
  • 2016-09-05
  • 2017-06-22
相关资源
最近更新 更多