Как искать значение в многомерном массиве, например, я хочу искать ключевое слово example
в следующих данных в mongodb. Я использовал для извлечения всех данных из команды
>db.info.find()
{ "_id" : ObjectId("4f74737cc3a51043d26f4b90"), "id" : "12345", "info" : [ { "sno" : 1, "name" : "ABC", "email" : "abc@example.com" }, { "sno" : 2, "name" : "XYZ", "email" : "xyz@example.com" }, { "sno" : 3, "name" : "XYZ", "email" : "xyz@demo.com" }, { "sno" : 4, "name" : "ABC", "email" : "abc@demo.com" }, { "sno" : 5, "name" : "Rohan", "email" : "rohan@example.com" } ] }
Теперь, чтобы найти данные, имеющие example
я использовал команду
>db.info.find({"info.email":"example"})
и это дает
{ "_id" : ObjectId("4f74737cc3a51043d26f4b90"), "id" : "12345", "info" : [ { "sno" : 1, "name" : "ABC", "email" : "abc@example.com" }, { "sno" : 2, "name" : "XYZ", "email" : "xyz@example.com" }, { "sno" : 3, "name" : "XYZ", "email" : "xyz@demo.com" }, { "sno" : 4, "name" : "ABC", "email" : "abc@demo.com" }, { "sno" : 5, "name" : "Rohan", "email" : "rohan@example.com" } ] }
Но я хочу только 3 из 5 подстрочных строк, например
{ "_id" : ObjectId("4f74737cc3a51043d26f4b90"), "id" : "12345", "info" : [ { "sno" : 1, "name" : "ABC", "email" : "abc@example.com" }, { "sno" : 2, "name" : "XYZ", "email" : "xyz@example.com" }, { "sno" : 5, "name" : "Rohan", "email" : "rohan@example.com" } ] }
Rohan, MongoDB всегда возвращает весь документ, который вы ищете. Вы не можете просто вернуть элементы массива, в которых было найдено ваше ключевое слово. Если вы хотите это сделать, вам нужно убедиться, что все встроенные документы в поле «информация» находятся в их собственной коллекции. И это может означать, что вам нужно связать их с исходным документом в вашей сборнике «информация». Возможно, что-то вроде:
{ "sno" : 1, "name" : "ABC", "email" : "abc@example.com" "info_id" : "12345", },
Кроме того, вы можете, конечно, выполнить пост-обработку в PHP, чтобы получить только те строки, которые вы хотите.
Возможно, это хорошая идея? http://php.net/manual/en/class.mongoregex.php
Я попробовал функцию «Уменьшить график», и он работает над такими проблемами, код чего-то типа:
Напишите функцию отображения
map=function () { filter = []; this.info.forEach(function (s) {if (/example/.test(s.email)) {filter.push(s);}}); emit(this._id, {info:filter}); }
Напишите функцию уменьшения
reduce=function(key, values) { return values;}
Функция MapReduce
res=db.info.mapReduce(map,reduce,{out:{inline:1}})
И The Output выглядит нравится:
"results" : [ { "_id" : ObjectId("4f9a2de0ea4a65c3ab85a9d3"), "value" : { "info" : [ { "sno" : 1, "name" : "ABC", "email" : "abc@example.com" }, { "sno" : 2, "name" : "XYZ", "email" : "xyz@example.com" }, { "sno" : 5, "name" : "Rohan", "email" : "rohan@example.com" } ] } } ], "timeMillis" : 1, "counts" : { "input" : 3, "emit" : 3, "reduce" : 0, "output" : 3 }, "ok" : 1,
Теперь вы можете найти свои данные поиска
printjson(res.results)
Вы пробовали $ (проецирование)?
db.info.find({"info.email":"example"}, {"info.email.$":1})
документ