递归扫描子文档

时间:2013-12-09 08:15:48

标签: mongodb

我有一个包含四个文件的集合

{_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”的元素的所有文档?

2 个答案:

答案 0 :(得分:0)

现在 MongoDB find()仅限于one document level,您可以使用cursor通过自己的迭代扩展此功能,并应用programming logic来实现所需的解决方案。

在以下网址找到更多信息:

答案 1 :(得分:0)

为此,您必须迭代光标返回的每个项目并“手动”遍历每个文档。

这不是一个mongo查询!请注意,我的实际查询为空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 ] );
    }
  }
}

请注意,这不是经过测试的代码(此机器上没有mongo)。大多数递归搜索函数都来自这篇文章 - Traverse all the Nodes of a JSON Object Tree with JavaScript


参考文献 -