Двойное совпадение в агрегации MongoDB - PullRequest
0 голосов
/ 09 января 2019

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

Col1

{"_id":ObjectId("5c13fa0178cd81112f1d5ba5"),
"common_id": 123,
"context":"app"   
}

контекст имеет различные параметры, такие как «приложение», «дБ», «сеть»

Col2

{"_id":ObjectId("5c13fa0178cd81112f1d5b34"),
"common_id":123,
"name":"android-app"
"status":"Up"
}

Статус имеет различные опции, такие как «Вверх», «Вниз», «Пониженный»

Я заинтересован в получении результата, как:

{
"name":"android-app",
}

Только в том случае, если контекст является приложением, а статус для элемента с таким общим идентификатором.

Я пробовал как:

col1.aggregate([{"$match": {"context":"app"}},
                  {"$lookup": {"from":col2,
                               "localField": "common_id",
                               "foreignField": "common_id",
                               "as": "output_info"}},
                  {"$unwind": {"path": "$output_info"}}, 
                  {"$match": "$output_info.status":"Up"},  
                  {
                    "$project":{
                      "$output_info.name":1
                  }}
                  ])

Но получается ошибка ..

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Попробуйте, у вас есть некоторые синтаксические ошибки в вашем запросе

  1. $lookup из таблицы не заключено в двойные кавычки
  2. $match этап отсутствует {},
  3. $match и $project имя поля не должно начинаться с $

запрос

db.col1.aggregate([
    {"$match": {"context":"app"}},
    {"$lookup": {
        "from":"col2",
        "localField": "common_id",
        "foreignField": "common_id",
        "as": "output_info"
    }},
    {"$unwind": {"path": "$output_info"}}, 
    {"$match": {"output_info.status":"Up"}}, 
    {"$project":{"output_info.name":1}}
])
0 голосов
/ 09 января 2019

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

db.col.find ({context: "app", статус: "Up"})

Если у вас есть агрегат, я могу более подробно рассмотреть запрос.

...