не может отфильтровать с помощью $ match узла по значению другого подузла в MongoDB - PullRequest
0 голосов
/ 28 апреля 2020

среда: пн go 4.2.2. вызывая из Compass 1.20.5

я сделал $unwind 2 элемента массива (одного документа) в 2 отдельных документа:

 {
    { id: 1 },
    { termTrg: { lang: "ara"} },
    { sublangTrans: { lang: "apj"} }
 }

и

 {
    { id: 1 },
    { termTrg: { lang: "ara"} },
    { sublangTrans: { lang: "ara"} }
 }

Перед тем как я $group снова отправлю их по идентификатору 1 в один документ, я sh отфильтрую по $match документам, в которых атрибуты lang в документе совпадают. Предоставляя строку ara статически, удаляет второй документ, как предполагалось.

$match { 'sublangTrans.lang' : { $ne: 'ara' } }

Если я пытаюсь заменить ara значением узла termTrg.lang, он не удаляет какие-либо документы.

$match { 'sublangTrans.lang' : { $ne: 'termTrg.lang' } }

Почему значение termTrg.lang не разрешено? Какой правильный синтаксис? Есть ли альтернативный способ фильтрации документов?

1 Ответ

2 голосов
/ 28 апреля 2020

Следующая строка будет соответствовать строке, которая не равна termTrg.lang

$match { 'sublangTrans.lang' : { $ne: 'termTrg.lang' } }

Чтобы получить разрешенное значение termTrg.lang, необходимо использовать $expr https://docs.mongodb.com/manual/reference/operator/query/expr/

$match: { $expr: { $ne: ['$sublangTrans.lang', '$termTrg.lang'] } }

В случае, если вы хотите сопоставить элементы с одинаковым lang attrubute

$match: { $expr: { $eq: ['$sublangTrans.lang', '$termTrg.lang'] } }
...