Как искать строку во внутреннем массиве с помощью mongodb?

Как искать значение в многомерном массиве, например, я хочу искать ключевое слово 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}) 

документ