Несколько условий объединения с использованием множества коллекций с конвейером mongodb - PullRequest
0 голосов
/ 06 марта 2020

критерии для поиска

{
  fullName: "aaaa bbb",
  order: 478
}

продуктов коллекции. js:

{
  _id: ObjectId("5684f3c454b1fd6926c324fd"),
  firstNameProduct: "aaaa",
  secondNameProduct: "bbb"
},
{
  _id: ObjectId("5684f3c454b1fd6926c54d2f"),
  firstNameProduct: "aaaa",
  secondNameProduct: "kkk"
}

клиентов коллекции. js:

{
  _id: ObjectId("56d82612b63f1c31cf906003"),
  fullName: "aaaa bbb",
  order: 478
},
{
  _id: ObjectId("56d82612b63f1c31cf90ht44"),
  fullName: "aaaa www",
  order: 811
},
{
  _id: ObjectId("56d82612b63f1c31cf954fu2"),
  fullName: "aaaa bbb",
  order: 133
}

нужно найти продукт, который соответствует этим критериям, ожидаемый результат :

{
  _id: ObjectId("5684f3c454b1fd6926c324fd"),
  firstNameProduct: "aaaa",
  secondNameProduct: "bbb"
}

Как мне написать конвейер?

Большое спасибо!

1 Ответ

1 голос
/ 06 марта 2020

Edit: лучший способ справиться с этим, вероятно, обновить вашу модель документа. Вы можете изменить коллекцию клиентов на имя и имя.

В качестве альтернативы, вы можете использовать конвейер агрегации, как показано ниже:

[
    {$match: {fullName:"aaaa bbb", order:478}}, 
    {$lookup: {
    from: 'products',
    let: { productName: "$fullName"},
    pipeline: [
        {"$match": {
            $expr: {
            $and: [
                {$eq: ["$firstNameProduct", {"$arrayElemAt": [{"$split": ["$$productName", " "]}, 0]} ]},
                {$eq: ["$secondNameProduct", {"$arrayElemAt": [{"$split": ["$$productName", " "]}, 1]} ]}
                ]
            }
        }}],
    as: 'matchingProduct'
    }}
]

На этапе поиска выполняется поиск товаров, которые соответствуют firstNameProduct и secondNameProduct. В результате получается объект, который выглядит следующим образом:

_id:56d82612b63f1c31cf906003
name1:"aaaa"
name2:"bbb"
matchingProduct:Array
  0:Object
    secondNameProduct:"bbb"
    _id:5684f3c454b1fd6926c324fd
    firstNameProduct:"aaaa"
order:478

Вы можете добавить этап $ project для очистки данных, если вам нужно.

Этот конвейер предполагает, что будут только два продукта, и они будут перечислены в одном и том же порядке в обеих коллекциях.

...