Найти ({пример: {$ elemMatch: {$ eq: userId}}}) .. в совокупности - возможно ли это? - PullRequest
0 голосов
/ 15 мая 2019
database:
[{to_match: [ userID_1, userId_2 ], data: [{...}] },
{to_match: [ userID_1, userId_2, userId_3 ], data: [{...}] },
{to_match: [ ], data: [{...}] }]
  1. Поиск по элементу в массиве 'to-match'.

Текущее решение:

Replacement.find(
   { applicants: { $elemMatch: { $eq: userId_1 } } },
Совокупный поиск $ по результату 1.
a.Могу ли я найти и собрать?б.Должен ли я сначала агрегировать, а затем сопоставить?
  • если да, как сопоставить элемент в массиве?

Я пытался объединить:

$lookup // OK
{ $match: { applicants: { $in: { userId } } } } // issues

Спасибо

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Выполнение $ elemMatch только для одного поля эквивалентно использованию find ( link )

Как правило, эффективно ограничивать данные, над которыми будет работать стадия поиска.Поэтому, если я правильно понимаю, вы хотите отфильтровать элементы массива «to_match», а затем выполнить поиск по этому результату.

Вот что я бы предложил: -

    aggregate([
    {
        $project : {
            to_match: {
                    $filter: {
                           input: "$to_match",
                           as: "item",
                           cond: { $eq: [ "$$item", "userId_3" ] }
                        }
            },
            data : 1
        }
    },
    {
        $match : { "to_match" : {$ne : []}}
    },
    //// Lookup stage here
])

На основеполе, в котором вы хотите выполнить поиск, вы можете отменить этот результат.

0 голосов
/ 15 мая 2019

Используйте $ lookup и $ match в совокупности

Вместо $ в использовании используется $ elemMatch, как показано ниже:

{ $match: { applicants:  { $elemMatch: { $eq: userId_1 }  } } }
...