Как выполнить поиск в агрегации, когда foreignField находится в массиве? - PullRequest
1 голос
/ 30 апреля 2019

У меня есть две коллекции:

// users

{
    _id: "5cc7c8773861275845167f7a",
    name: "John",
    accounts: [
        { 
            "_id": "5cc7c8773861275845167f76", 
            "name": "Name1", 
        },
        { 
            "_id": "5cc7c8773861275845167f77", 
            "name": "Name2", 
        }
    ]
}
// transactions

{
    "_id": "5cc7c8773861275845167f75",
    "_account": "5cc7c8773861275845167f76",
}

Используя поиск, я хочу заполнить поле _account в коллекции транзакций соответствующим элементом из массива users.accounts.

Итак,Я хочу, чтобы конечный результат был следующим:

{
    "_id": "5cc7c8773861275845167f75",
    "_account": { 
        "_id": "5cc7c8773861275845167f76", 
        "name": "Name1", 
    },
}

Я уже пытался использовать этот код:

db.transactions.aggregate([
   {
     $lookup:
       {
         from: "users.accounts",
         localField: "_account",
         foreignField: "_id",
         as: "account"
       }
  }
])

В массиве результатов счет становится пустым.

Что такоеправильный способ сделать это?

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Вы можете использовать агрегацию ниже с mongodb 3.6 и выше

db.transactions.aggregate([
  { "$lookup": {
    "from": "users",
    "let": { "account": "$_account" },
    "pipeline": [
      { "$match": { "$expr": { "$in": ["$$account", "$accounts._id"] } } },
      { "$unwind": "$accounts" },
      { "$match": { "$expr": { "$eq": ["$$account", "$accounts._id"] } } }
    ],
    "as": "_account"
  }},
  { '$unwind': '$_account' }
])
0 голосов
/ 30 апреля 2019

Попробуйте с этим

Я думаю, что случай 1 лучше.

1) -

db.getCollection('transactions').aggregate([
{
$lookup:{
from:"user",
localField:"_account",
foreignField:"accounts._id",
as:"trans"
}    
},
{
$unwind:{
    path:"$trans",
    preserveNullAndEmptyArrays:true
    }
},
{
$unwind:{
    path:"$trans.accounts",
    preserveNullAndEmptyArrays:true
    }
},
{$match: {$expr: {$eq: ["$trans.accounts._id", "$_account"]}}},
{$project:{
_id:"$_id",
_account:"$trans.accounts"
}}
])

2) -

db.getCollection('users').aggregate([
{
$unwind:{
path:"$accounts",
preserveNullAndEmptyArrays:true
}    
},
{
$lookup:
{
 from: "transactions",
 localField: "accounts._id",
 foreignField: "_account",
 as: "trans"
}
},
{$unwind:"$trans"},
{
$project:{
    _id:"$trans._id",
    _account:"$accounts"
    }
}
])
...