Монго поиск, чтобы вернуть местный, даже если иностранный не соответствует - PullRequest
0 голосов
/ 17 сентября 2018

Допустим, у меня есть коллекция User, и у пользователя может быть много Books.

Я хочу запросить User, а затем выполнить поиск, чтобы получить Books данные с конкретными userId иbookId но если у этого пользователя нет Books, все равно возвращайте данные пользователя с пустыми книгами или с нулем.

Mongo: 3,4

Что япробовал.

$this->mongo->selectCollection('users')->aggregate([
    ['$match' => ['userId' => $userId]],
    [
        '$lookup' => [
            'from' => 'books',
            'localField' => 'userId',
            'foreignField' => 'userId',
            'as' => 'books'
        ]
    ],
    ['$unwind' => [
        'path' => '$books',
    ]],
    ['$match' => ['books.bookId' => $bookId]]
]);

Проблема: с кодом выше, он вернет пустой результат, когда книга не соответствует.Я все еще хочу получить данные пользователя.

Пример ожидаемого результата:

Когда книга найдена

user : {
    userId: 1
    name: xxx,
    books: {
        name: Book name
        userId: 1
    }
}

Когда книга не найдена

user : {
    userId: 1,
    name: xxx,
    books: null or whatever
}

1 Ответ

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

Для фильтрации массива books необходимо использовать $filter.

$this->mongo->selectCollection('users')->aggregate([
  [ '$match' => ['userId' => $userId]],
  [ '$lookup' => [
    'from' => 'books',
    'localField' => 'userId',
    'foreignField' => 'userId',
    'as' => 'books'
  ]],
  [ '$addFields' => [
    'books' => [
      '$filter' => [
        'input' => '$books',
        'as' => 'book',
        'cond' => [ '$eq' => ['$$book.userId', bookId]]
      ]
    ]
  ]]
])
...