объявление переменных в MongoDB с использованием $ lookup с let и pipe - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь добавить функцию как на мой сайт.Я сделал коллекцию лайков со следующей схемой.Я использую пользовательский _id, чтобы избежать создания дополнительного индекса.

{
  _id: {
    postId: ObjectId,
    userId: ObjectId
  }
}

У меня есть маршрут на моем сервере, который ищет коллекцию сообщений с использованием MongoDB агрегаты .Я пытаюсь добавить стадию $ lookup к текущему конвейеру, чтобы добавить свойство Мне нравится с типом Boolean , указывающим, является ли сообщение или нет сообщениепонравился пользователю.Вот этап $ lookup , который не работает ( понравился возвращает пустой массив все время, даже когда есть соответствующий документ типа):

{
  $lookup: {
    from: 'likes',
    let: { likedPostId: '$_id.postId', likerUserId: '$_id.userId' },
    pipeline: [
      { $match:
        { $expr:
          { $and:
            [
              { $eq: [
                '$$likerUserId',
                  ObjectId('12345')
              ]},
              { $eq: [
                  '$$likedPostId',
                  '$_id'
              ]}
            ]
          }
        }
      }
    }
  ],
  as: 'liked'
  }
}

Я думаюпроблема в том, что переменные на самом деле не содержат значений, которых я ожидаю.Есть ли способ решить это?Также, если вы знаете более простой способ реализации этого, я буду признателен, если вы поделитесь им со мной.

Я попытался сравнить два идентичных экземпляра ObjectId () , чтобы обеспечить ObjectId экземпляров можно сравнить с помощью оператора $ eq .Также попытался определить вложенные переменные , как указано в приведенном выше фрагменте кода, в другом вложенном поле .единственное отличие в этой проблеме состоит в том, что я пытаюсь вытащить свойства за пределы поля _id .

PS Я знаю, что Мне нравится свойство будет Array вместо Boolean .Но я думаю преобразовать это в Boolean на следующем этапе.Но сейчас это не проблема.

1 Ответ

1 голос
/ 19 июня 2019

Это наоборот.Если вы используете $lookup в коллекции likes, то цель раздела let состоит в том, чтобы определить переменные, которые относятся к коллекции, в которой выполняется агрегация.С другой стороны, вы можете ссылаться на поля, определенные в коллекции likes, используя один знак доллара внутри pipeline.Попробуйте:

{
    $lookup: {
        from: 'likes',
        let: { id: '$_id' },
        pipeline: [
            { $match:
                { $expr:
                { $and:
                    [
                    { $eq: [
                        '$_id.userId',
                        ObjectId('12345')
                    ]},
                    { $eq: [
                        '$_id.postId',
                        '$$id'
                    ]}
                    ]
                }
                }
            }
        ],
        as: 'liked'
    }
}

РЕДАКТИРОВАТЬ: Пожалуйста, посмотрите на документы

let
Необязательно.Определяет переменные для использования на этапах поля конвейера.Используйте переменные выражения для доступа к полям из документов input до этапа поиска $.

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

...