2013-12-09 1 views
0

У меня есть коллекция с четырьмя документамиRecusively суб сканирования документов

{_id:as1d2a1das2d1afdfd, content:{ name: 'John'} } 
{_id:sdasd512a12asdad, content:{ sub: {name:'John'}}} 
{_id:sdaasddasdassd512a12, content:{ sub: {sub1:{name:'John'}}}} 
{_id:sdaasddasdassd512a12, content:{ sub: {sub1:{name:'Terry'}}}} 

Какой запрос можно использовать, чтобы найти все документы с элементом, который имеет имя атрибута равно «John»?

+1

Эта ситуация должна побудить вас пересмотреть путь, в котором вы храните ваши документы , Я не верю, что существует простой метод «только запроса», чтобы преодолеть это. Я буду счастлив, если окажется, что ошибаюсь :) :) – Lix

+0

Да, есть только демо, для которых я хочу, конечно, структура данных не такая, как – Ryo

+0

Что произойдет, если есть более одного атрибута имени? – Lix

ответ

0

Сейчас MongoDB find() ограничивается one document level, вы можете расширить эту функциональность вашей собственной итерации с помощью cursor и применения programming logic для достижения желаемого решения.

найти более подробную информацию по адресу:

+0

'', ограниченный одним под документом ... level "'? Что насчет 'find ({'content.sub.name': 'Terry'})'? Это действительный запрос, и он сверлит вниз на 2 вспомогательных документа ... – Lix

+0

коррекция: «один уровень документа» означает, что вам нужно использовать ссылку уровня 1 для развертки. – theBeacon

0

Чтобы сделать это, вам придется перебрать каждый элемент, что ваши возвращения курсора и пройти каждый документ «вручную».

Это не запрос манго! Обратите внимание, что мой фактический запрос пустой find().

Все, что я делаю здесь, это итерация результатов и фильтрация результатов, которые не имеют отношения к делу.

var results = []; 
db.data.find().forEach(function(doc){ 
    if (find_name_recursive(doc)){ 
     results.push(doc); 
    } 
}); 

function find_name_recursive(doc) { 
    for (var attr in doc) { 
    if (doc.name != "undefined" && doc.name == "John"){ 
     return true; 
    } 
    if (doc[ attr ] !== null && typeof(doc[ attr ]) == "object") { 
     // drill down deeper into the object 
     find_name_recursive(doc[ attr ]); 
    } 
    } 
} 

Обратите внимание, что это не проверенный код (на нем нет монго). Большинство рекурсивной функции поиска была взята с этого поста - Traverse all the Nodes of a JSON Object Tree with JavaScript


Ссылки -

+0

Поскольку для этого потребуется полное сканирование и извлечение каждого документа, оно не является особенно эффективным решением. – WiredPrairie

+0

Спасибо за вашу поддержку, я проверил ваш код с моими данными здесь http://jsfiddle.net/KS9kH/29/ Но у меня проблема, код snipt return find_recursive (doc [attr] [i]); in for loop, кажется, не зацикливается со всем элементом doc [attr], он работает только с первым элементом массива doc [attr] и возвращает, пожалуйста, помогите мне исправить его, спасибо :) – Ryo

+0

для получения довольно подробных данных, вы можете использовать это http://jsonprettyprint.com/ – Ryo

Смежные вопросы