Объединить данные из двух коллекций - PullRequest
0 голосов
/ 07 сентября 2018

Если у меня есть данные, хранящиеся в двух коллекциях в MongoDB, например:

Коллекция 1:

opened = [{id: 1, value: 1123}, {id: 2, value: 4231}, {id: 2, value: 3322}...]

Коллекция 2:

synched = [{id: 1, value: 12343}, {id: 2, value: 12322}, {id: 1, value: 12322}...]

Теперь я знаю, что могу сделать два вызова в БД и получить данные из обоих, но меня интересует потенциальная агрегация вызова и объединение данных из обеих коллекций, чтобы я получил следующий результат:

result = {synched: [{id: 1, value: 12343},{id: 1, value: 12322}], opened: [{id: 1, value: 1123}]}

Так что в моем случае, в настоящее время я делаю стандартный запрос только дважды:

db.opened.find({id: 1}, function(err, res){})
db.synched.find({id: 1}, function(err, res){})

Есть ли способ объединить их?

РЕДАКТИРОВАТЬ:

Оригинальный вопрос, который я разместил, немного изменился. Вот небольшое изменение, с которым мне нужно иметь дело, что ответ ниже не поддерживает.

Что если у меня есть массив идентификаторов, которые мне соответствуют:

{ $match: { 'id': {$in: [1,2]} }}

Итак, limit вызов действительно испортил это. Все, что мне нужно, это все документы из synched и все документы из opened, которые соответствуют любому из идентификаторов в массиве, но выполнение ограничения возвращает только первое обнаруженное. Это не всегда так. Может быть несколько документов с одним и тем же свойством id. Это свойство не _id, которое является уникальным.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 07 сентября 2018

Вы можете попробовать агрегацию ниже в mongodb 3.4 и выше

db.synched.aggregate([
  { "$limit": 1 },
  { "$facet": { 
    "synched": [
      { "$match": { "id": 1  }}
    ],
    "opened": [
      { "$match": { "id": 1  }},
      { "$limit": 1 },
      { "$lookup": {
        "from": "opened",
        "localField": "id",
        "foreignField": "id",
        "as": "opened"
      }},
      { "$unwind": "$opened" },
      { "$replaceRoot": { "newRoot": "$opened" }}
    ]
  }},
  { "$project": { "opened": 1, "synched": 1 }}
])

и с новым $lookup синтаксис

db.synched.aggregate([
  { "$facet": { 
    "synched": [
      { "$match": { "id"': { "$in": [1,2] }}}
    ],
    "opened": [
      { "$limit": 1 },
      { "$lookup": {
        "from": "opened",
        "pipeline": [
          { "$match": { "id"': { "$in": [1,2] }}}
        ],
        "as": "opened"
      }},
      { "$unwind": "$opened" },
      { "$replaceRoot": { "newRoot": "$opened" }}
    ]
  }},
  { "$project": { "opened": 1, "synched": 1 }}
])
...