Строка поиска MongoDB в массиве объектов

#javascript #php #mongodb

#javascript #php #mongodb

Вопрос:

У меня есть структура в MongoDB, которая содержит разное количество элементов в массиве, называемом «элементы». Чтобы выполнить поиск, я использую следующую команду, которая сначала преобразует содержимое в строку, так как в this.items существует разная структура в зависимости от объекта:

 db.getCollection('docs').find.('JSON.stringify(this.items[0].value).toLowerCase().indexOf("text")!=-1')
  

Моя проблема в том, что, поскольку я не знаю количество элементов, содержащихся в каждом документе, мне пришлось бы использовать подстановочный знак в качестве this.items[*].value, но это не работает.

Кто-нибудь знает какое-либо решение или у него есть другая идея для этого?

Комментарии:

1. getCollection('docs').find вместо getCollection('docs')find

Ответ №1:

Вы можете использовать $elemMatch (https://docs.mongodb.com/manual/reference/operator/projection/elemMatch /)

 db.docs.find({items: {$elemMatch: {value: {$regex : "text"}}}});
  

Таким образом, этот запрос найдет все документы с item в массиве items, которые содержат строку «text» в свойстве value, после этой операции вы можете подсчитать, сколько элементов в документе.

Ответ №2:

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

 db.getCollection('docs').find({ 'items.value': /text/i })
  

Комментарии:

1. Сработало с регулярным выражением! Спасибо!

Ответ №3:

Вы можете повторить каждый документ и применить indexOf , что-то вроде этого..

 var cursor = db.getCollection('docs').find({}); // get all docs
var newOut = []; // new array of items if match with some condition
while ( cursor.hasNext() ){ // iterate all docs

   var doc = cursor.next(); // get the document in focus
   doc.items.forEach(function(item){ // iterate the items of doc.items
       if ( item.toLowerCase().indexOf("text") !== -1 ) // check if text exists in array
           newOut.push(item); // add to new array
   });

};
printjson(newOut);