【问题标题】:Lookup with condition mongoDb使用条件 mongoDb 查找
【发布时间】:2020-04-02 16:10:08
【问题描述】:

我有一个集合 myCollection,其中包含一组成员:

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

和一个集合成员

{
    firstname : String,
    lastname  : String
}

我有这个数据

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

我只想选择状态为 1 的成员并进行查找以获取成员的数据,我试过了,但它返回所有成员状态(1 和 2), 请问如何查询,谢谢。

db.getCollection('myCollection').aggregate([
    {$match: {_id: ObjectId("5e83791eb49ab07a48e0282b")}},
           { "$lookup": {
                "from": "members",
                "let": { "ar": "$members.memberId" , "ar2": "$members.status" },


    "pipeline": [
      { "$match": {
        "$expr": {
          "$cond": [
            { "$in": ["$_id", "$$ar"] },

          {},
           { "$eq": [1, "$$ar2"] }, 
          ]
        }
      }}
    ],
    "as": "Member"
  }},
         {   $project: {

                 "Member._id" : 1,
                "Member.firstname" : 1,
                "Member.lastname" : 1
            }

        }

    ])

【问题讨论】:

    标签: mongodb aggregate lookup


    【解决方案1】:

    如果你只想要状态 1 的数据,那么你应该先过滤掉结果,然后使用 $lookup

    $match:{
        "members.status":1
    }
    

    我不知道你为什么在 $match 中需要 _id,但是上面提到的 $match 对象可以过滤掉结果

    【讨论】:

    • 我在第一次匹配时使用了这个条件,像这样 {$match: {_id: ObjectId("5e83791eb49ab07a48e0282b"), "members.status": 1}} 和查找,但查询返回状态为 1 和 2 的成员
    猜你喜欢
    • 2020-10-16
    • 2019-05-11
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2022-01-20
    相关资源
    最近更新 更多