MongoDB агрегирует несколько объектов - PullRequest
2 голосов
/ 24 мая 2019

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

{
    "_id" : ObjectId("123"),
    "from" : ObjectId("456"),
    "to" : ObjectId("789"),
    "content" : "Hi!",
    "createdAt" : 1558037545568.0
}

Я хочу рассказать об их разговоре, отсортированном по createdAt по убыванию, а также объединить их пользовательские объекты. Я знаю, что мне нужно использовать $lookup для поиска по запросу users, но у меня есть несколько вопросов:

  1. Как я могу создать $lookup операцию, которая принесет обоим пользователям?
  2. Как управлять им так, что иногда пользователь 456 является пользователем from, а иногда to? То же самое для пользователя 789. Я не получил это слишком много.

Это текущий запрос, в котором все упорядочено без пользовательских объектов:

db.getCollection('messages').aggregate([{
    $match: {
      $or: [
        { from: ObjectId("456") },
        { to: ObjectId("789") },
        { from: ObjectId("789") },
        { to: ObjectId("456") }
      ]
    }
  }, {
    $sort: { createdAt: -1 }
  }])

Спасибо всем за помощь!

1 Ответ

2 голосов
/ 24 мая 2019

Вы можете "нормализовать" свои документы, добавив массив users, который будет содержать отсортированные по возрастанию from и to.Тогда проще запустить $match в этом массиве (аргументы сортировки),

db.collection.aggregate([
    {
    $addFields: {
        users: [ { $min: [ "$from", "$to" ] }, { $max: [ "$from", "$to" ] } ]
    } 
    },
    {
        $match: { users: [ "456", "789" ] }
    }
])

$ lookup можно запустить непосредственно в массиве, поэтому следующий синтаксис должен работать как следующий шаг:

{
    $lookup: {
        from: "users",
        localField: "users",
        foreignField: "_id",
        as: "users"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...