首页 > 解决方案 > 具有多个条件的聚合和项目

问题描述

我有一个包含成员数组的 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但它没有返回 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
                ]
            }

            }
        }
    ])

谢谢你的回复。

标签: mongodbaggregatemongo-projection

解决方案


如果你想得到只是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" } } }
])  

推荐阅读