MongoDB聚合: Use field value of current document in $match $or query

标签 mongodb mongodb-query aggregation-framework

我有一个聚合管道,我的文档当前采用以下格式:

{
    "user": "5e3d326537df7e4dda73eb23",
    "sharedWithGroups": [ "5e3d326437df7e4dda73eb13", "5e3d326437df7e4dda73eb19" ],
    "userGroupIds": [ "5e3d326437df7e4dda73eb19" ]
}

其中 userGroupIds 是上一阶段的结果,我在其中找到用户所在组的 ID。

我正在尝试向管道添加一个匹配阶段,以查找具有与特定 ID 匹配的用户 ID 或具有包含以下条目之一的 sharedWithGroups 属性的所有文档userGroupIds

我认为这样的事情会起作用:

{
  $match: {
    $or: [
      { user: "5e3d326537df7e4dda73eb23" },
      { sharedWithGroups: { $in: "$userGroupIds" } }
    ]
  }
}

但我收到错误:$in 需要一个数组。我不明白,因为 $userGroupIds 绝对是一个数组。我尝试过使用 $expr,认为字段值可能无法解析,但没有运气。这种方法是否可行,或者是否有另一种/更好的方法来使用多个条件过滤这些文档?

最佳答案

你可以试试这个:

{
    $match: {
        $or: [
            { user: "5e3d326537df7e4dda73eb23" },
            { $expr: { $gt: [{ $size: { $setIntersection: ["$sharedWithGroups", "$userGroupIds"] } }, 0] } }
        ]
    }
}

测试: MongoDB-Playground

(或)

{
    $match: {
        $or: [
            { user: "5e3d326537df7e4dda73eb23" },
            { $expr: { $setIsSubset: ["$userGroupIds", "$sharedWithGroups"] } }
        ]
    }
}

测试: MongoDB-Playground

关于MongoDB聚合: Use field value of current document in $match $or query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60534653/

相关文章:

java - MongoDB 身份验证和 Apache Camel 的问题

c++ - MongoDB C++ 查询文档的子元素

java - Mongodb java驱动程序查询转换

php - 在 mongodb 中匹配的 OR 条件的百分比

linux - 我如何远程连接到由 mongod 启动的 mongodb

javascript - 使用 Node.js 驱动程序打印和更新 MongoDB 中的所有文档

node.js - POST 到 AWS EC2 Mongodb 数据库在生产中不起作用

javascript - 自定义 MongoDB 查询以返回特定的子文档

node.js - 如何在mongodb中组合对象数组结果

node.js - 如何使用 mongoose/mongodb 在单个查询中应用 $match、$group 和 $sum