Получить данные из 2 коллекций в mongodb в одном запросе - PullRequest
0 голосов
/ 09 октября 2018

Я хотел получить данные из 2 независимых коллекций и отсортировать результаты на основе date с помощью одного запроса.Это возможно даже в mongodb?У меня есть коллекции:

OrderType1

{
    "id": "1",
    "name": "Hello1",
    "date": "2016-09-23T15:07:38.000Z"
},
{
    "id": "2",
    "name": "Hello1",
    "date": "2015-09-23T15:07:38.000Z"
}

OrderType2

    {
        "id": "3",
        "name": "Hello3",
        "date": "2012-09-23T15:07:38.000Z"
    },
    {
        "id": "4",
        "name": "Hello4",
        "date": "2018-09-23T15:07:38.000Z"
    }

Ожидаемый результат

[
    {
        "id": "3",
        "name": "Hello3",
        "date": "2012-09-23T15:07:38.000Z"
    },
    {
        "id": "2",
        "name": "Hello1",
        "date": "2015-09-23T15:07:38.000Z"
    },
    {
        "id": "1",
        "name": "Hello1",
        "date": "2016-09-23T15:07:38.000Z"
    },

    {
        "id": "4",
        "name": "Hello4",
        "date": "2018-09-23T15:07:38.000Z"
    }
]

Теперь я хочу получить оба типа orders в одном запросе, отсортированном по дате.

1 Ответ

0 голосов
/ 09 октября 2018

Вы можете попробовать агрегацию ниже с mongodb 3.6 и выше, но я думаю, что вы должны использовать два запроса, потому что для большого набора данных $lookup конвейер будетнарушение BSON предел из 16 МБ .Но также это зависит от вашего $match состояния или $limit.Если они применяются к конвейеру $lookup, то ваша агрегация будет работать отлично.

db.OrderType1.aggregate([
  { "$limit": 1 },
  { "$facet": {
    "collection1": [
      { "$limit": 1 },
      { "$lookup": {
        "from": "OrderType1",
        "pipeline": [{ "$match": { } }],
        "as": "collection1"
      }}
    ],
    "collection2": [
      { "$limit": 1 },
      { "$lookup": {
        "from": "OrderType2",
        "pipeline": [{ "$match": { } }],
        "as": "collection2"
      }}
    ]
  }},
  { "$project": {
    "data": {
      "$concatArrays": [
        { "$arrayElemAt": ["$collection1.collection1", 0] },
        { "$arrayElemAt": ["$collection2.collection2", 0] },
      ]
    }
  }},
  { "$unwind": "$data" },
  { "$replaceRoot": { "newRoot": "$data" } }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...