我想在MongoDB集合中找到基于2个条件的对象的内部array.请参考所附图像的模式.

enter image description here

我的查询是这样的:

Find inside toUsers array, where _id == given ObjectId AND user=given_user_object_id, AND visited == false

基本上,对于给定的_id,我希望筛选出visited == false的所有用户.

 [{
  "_id": {
    "$oid": "651548277423d019b0c251f6"
  },
  "toUsers": [
    {
      "user": {
        "$oid": "65014c6303b5bf048f627b72"
      },
      "visited": true,
      "createdAt": {
        "$date": "2023-09-28T09:32:23.352Z"
      },
      "updatedAt": {
        "$date": "2023-09-28T11:44:00.673Z"
      }
    },
    {
      "user": {
        "$oid": "650167123cc7410860126076"
      },
      "visited": false,
      "createdAt": {
        "$date": "2023-09-28T09:32:23.352Z"
      },
      "updatedAt": {
        "$date": "2023-09-28T09:32:23.352Z"
      }
    }
  ],
  "notification": {
    "message": "ccc - Skumar required approval for this workbook. This is very long text that might truncate",
    "action": {
      "workbook": "6511674ed0a5e9db5823051b",
      "actionText": "Goto Workbook"
    }
  },
  "expiryTime": {
    "$date": "2022-03-06T11:00:00.000Z"
  },
  "createdBy": {
    "$oid": "65014c6303b5bf048f627b72"
  },
  "updatedBy": "65014c6303b5bf048f627b72",
  "createdAt": {
    "$date": "2023-09-28T09:32:23.352Z"
  },
  "updatedAt": {
    "$date": "2023-09-28T11:44:00.673Z"
  }
},
{
  "_id": {
    "$oid": "6515493994822bf9866ee885"
  },
  "toUsers": [
    {
      "user": {
        "$oid": "65014c6303b5bf048f627b72"
      },
      "visited": true,
      "createdAt": {
        "$date": "2023-09-28T09:36:57.827Z"
      },
      "updatedAt": {
        "$date": "2023-09-28T11:18:59.759Z"
      }
    },
    {
      "user": {
        "$oid": "650167123cc7410860126076"
      },
      "visited": false,
      "createdAt": {
        "$date": "2023-09-28T09:36:57.828Z"
      },
      "updatedAt": {
        "$date": "2023-09-28T09:36:57.828Z"
      }
    }
  ],
  "notification": {
    "message": "zzz - SKumar required approval for this workbook. This is very long text that might truncate",
    "action": {
      "workbook": "6511674ed0a5e9db5823051b",
      "actionText": "Goto Workbook"
    }
  },
  "expiryTime": {
    "$date": "2022-03-06T11:00:00.000Z"
  },
  "createdBy": {
    "$oid": "65014c6303b5bf048f627b72"
  },
  "updatedBy": {
    "$oid": "65014c6303b5bf048f627b72"
  },
  "createdAt": {
    "$date": "2023-09-28T09:36:57.828Z"
  },
  "updatedAt": {
    "$date": "2023-09-28T11:18:59.759Z"
  }
}]

推荐答案

  • 您可以根据您的条件使用$filter来筛选toUsers数组
  1. 首先使用_id过滤掉主文档
  2. 过滤已过滤文档的toUsers%

通过使用$addFields,您不会丢失其他字段,因此您可以自由地对任何不需要的字段执行$project操作.

db.collection.aggregate([
  { $match: { "_id": ObjectId("651548277423d019b0c251f6") } },
  {
    $addFields: {
      toUsers: {
        $filter: {
          input: "$toUsers",
          cond: {
            $and: [
              { $eq: [ "$$this.user", ObjectId("650167123cc7410860126076") ] },
              { $eq: [ "$$this.visited", false ] }
            ]
          }
        }
      }
    }
  },
  { $match: { toUsers: { $ne: [] }  } } //to avoid document when toUsers empty
])

demo

  • 使用$unwind->$match-->$group战略.我更喜欢前一种方法,因为在这里您将丢失其他字段,除非您在$group中使用$first显式指定它们
db.collection.aggregate([
  { $match: { "_id": ObjectId("651548277423d019b0c251f6") } },
  { $unwind: "$toUsers" },
  { $match: { "toUsers.user": ObjectId("650167123cc7410860126076"), "toUsers.visited": false } },
  { $group: { _id: "$_id", toUsers: { $push: "$toUsers" } } }
])

demo

Mongodb相关问答推荐

Mongo如何找到字段排除特殊字符

在MongoDB中使用explain()和查询时缺少winningPlan''''

映射数组值并查找每个匹配的集合

在 MongoDB 中加入多个集合

根据聚合管道MongoDB Atlas触发器中的条件更新多个字段

有谁知道这个错误的修复方法(TypeError: Cannot assign to read only property ‘map’ of object '#')

将 MongoDB BsonDocument 转换为字符串

更新文档中的数组时,如何在 MongoDB 和 C# 中使用 $push 更新修饰符

使用 MongoDb 处理迁移

MongoDB获取聚合查询的executionStats

什么 Javascript 库可以针对对象判断类似 MongoDB 的查询谓词?

你如何让 mongo 在远程服务器上运行?

在 Mongo 中存储嵌套类别的最有效方法?

Mongoimport json 文件更新或覆盖..?

MongoDB 范围查询中 $lt 和 $gt 的顺序

如何在 Meteor 应用程序之间共享 MongoDB 集合?

判断 mongoDB 是否连接

pre save和validate之间的mongoose区别?什么时候用哪一个?

MongoDb:聚合 $lookup 过滤外部文档

MongoDB 引用的最佳实践