Как выполнить запрос «каждый» в мангусте - PullRequest
0 голосов
/ 29 марта 2020

Допустим, у меня есть база данных с полем документа, содержащим следующее

new Test({fruits: [ 'apple', 'orange', 'banana']})

Я хочу запросить массив fruits другим массивом, убедившись, что переданный в запрос массив содержит все item в базе данных фруктов.

Обычным JavaScript Я бы сделал следующее:

var target = [ 'apple', 'orange', 'banana'];

var fruit2 = [ 'apple', 'orange', 'banana', 'peach']; // true
var fruit3 = [ 'mango', 'lemon', 'pineapple']; // false
var fruit4 = [ 'banana', 'apple', 'orange']; // true

const result = target.every(targetElem => fruit2.includes(targetElem));
console.log(result);

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

1 Ответ

0 голосов
/ 29 марта 2020

Если вы используете MongodB версии 3.6+, вы можете использовать $expr с $map, $allElementsTrue и $in для оценки каждого элемента массива в каждом документе по отношению к вашему массиву запросов.

db.collection.find({
    $expr:{
        $allElementsTrue:{
            $map:{
                input: "$fruits",
                in: {$in: ["$$this", [ 'apple', 'orange', 'banana', 'peach']]}
            }
         }
    }
})

Это, вероятно, будет не очень эффективным.

Детская площадка

Редактировать :

Альтернативный способ сделать это, что может использовать индекс, по крайней мере частично:

db.collection.find({fruits:{$all:[ 'apple', 'orange', 'banana', 'peach']}})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...