首页 > 解决方案 > Mongodb使用$lookup查找给定_id属于哪个对象(外域是一个数组)

问题描述

考虑以下集合:

用户

{
  _id : ObjectId("5e2b9ab8b1dbae5124e4b635")
  name : "user1"
}

{
  _id : ObjectId("5e2b9c29b1dbae5124e4b63b")
  name : "user2"
}

{
  _id : ObjectId("5e2b9cd2b1dbae5124e4b641")
  name : "user3"
}

{
  _id : ObjectId("5e2ba081b1dbae5124e4b64c")
  name : "user4"
}

业务帐户

{
  _id : 5e2c5e433e8d406769286567
  name : "account1"
  users : [ObjectId("5e2b9cd2b1dbae5124e4b641"), ObjectId("5e2b9c29b1dbae5124e4b63b")]
}

{
  _id : 4e2c5e433e8d40676928bb43
  name : "account2"
  users : [ObjectId("5e2b9ab8b1dbae5124e4b635")]
}

我需要确定每个用户属于哪个 business_account。(下面的期望结果)

{
  _id : ObjectId("5e2b9ab8b1dbae5124e4b635")
  name : "user1"
  belongs_to : "account2"
}

{
  _id : ObjectId("5e2b9c29b1dbae5124e4b63b")
  name : "user2"
  belongs_to : "account1"
}

{
  _id : ObjectId("5e2b9cd2b1dbae5124e4b641")
  name : "user3"
  belongs_to : "account1"
}

{
  _id : ObjectId("5e2ba081b1dbae5124e4b64c")
  name : "user4"
}

我在网上看到很多例子说要使用 $lookup/let/pipeline 但我不知道如何使用它来获得结果。

在我尝试过的查询下方。

db.user.aggregate([
  {'$lookup': 
    {
      'from': 'business_account',
      'let': { 'profile_id' : '$profile.profile_id' },
      'pipeline' : [
        { "$match": { "$expr": { "$in": ["$$profile_id", "$users"] } } },
      ],
      'as': 'account'
    }
  }
]);

标签: mongodbmongodb-query

解决方案


尝试这个 :

db.user.aggregate([
    {
        '$lookup':
        {
            'from': 'business_account',
            'let': { 'id': '$_id' }, // Here let is used to create local variable of user collection
            'pipeline': [
                { "$match": { "$expr": { "$in": ["$$id", "$users"] } } }
                , { "$project": { name: 1, _id: 0 } } // Projecting only name
            ],
            'as': 'belongs_to'
        }
    }, { $unwind: { path: "$belongs_to", preserveNullAndEmptyArrays: true } }, // unwinding belongs_to array($lookup will result in array) to object
    { $addFields: { belongs_to: '$belongs_to.name' } } /** Replacing "belongs_to" : { "name": "account2"} to "belongs_to" : "account2" */
])

测试: MongoDB-游乐场


推荐阅读