聚合和投影多个条件

Aggregate and project with multiples conditions

我有一个包含成员数组的集合 myCollection :

{
   name : String,
   members: [{status : Number, memberId : {type: Schema.Types.ObjectId, ref: 'members'}]
}

我有这个数据

"_id" : ObjectId("5e83791eb49ab07a48e0282b")
   "members" : [ 
        {
            "status" : 1,
            "_id" : ObjectId("5e83791eb49ab07a48e0282c"),
            "memberId" : ObjectId("5e7dbf5b257e6b18a62f2da9")
        }, 
        {
            "status" : 2,
            "_id" : ObjectId("5e837944b49ab07a48e0282d"),
            "memberId" : ObjectId("5e7de2dbe027f43adf678db8")
        }
    ],

我想通过聚合查询检查成员 5e7dbf5b257e6b18a62f2da9 是否与 status 1 一起存在,但它不存在 return true

db.getCollection('myCollection').aggregate([
        {$match: {_id: ObjectId("5e83791eb49ab07a48e0282b")}},
        {
            $project: {
              isMember: { 
                $cond: [
                   { $and: [ {$in: [ObjectId("5e7dbf5b257e6b18a62f2da9"), '$members.memberId']}, {$eq: ['$members.status', 1]} ] },
                     // if
                    true, // then
                    false // else
                ]
            }

            }
        }
    ])

感谢您的回复。

如果你只想得到 true/false 你可以像这样快捷方式:

db.collection.aggregate([
   { $match: { _id: ObjectId("5e83791eb49ab07a48e0282b") } },
   {
      $project: {
         isMember: {
            $map: {
               input: "$members",
               in: {
                  $and: [
                     { $eq: [ObjectId("5e7dbf5b257e6b18a62f2da9"), '$$this.memberId'] },
                     { $eq: [1, '$$this.status'] }
                  ]
               }
            }
         }
      }
   },
   { $set: { isMember: { $anyElementTrue: "$isMember" } } }
])

另一种风格是这样的:

db.collection.aggregate([
   { $match: { _id: ObjectId("5e83791eb49ab07a48e0282b") } },
   {
      $project: {
         isMember: {
            $map: {
               input: "$members",
               in: {
                  $eq: [
                     { memberId: ("5e7dbf5b257e6b18a62f2da9"), status: 1 },
                     { memberId: "$$this.memberId", status: "$$this.status" }
                  ]
               }
            }
         }
      }
   },
   { $set: { isMember: { $anyElementTrue: "$isMember" } } }
])