#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);