2013-12-09 54 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'}}}} 

哪个查询我可以用它来找到所有文档与具有名称的元素属性等于“约翰”的集合?

+1

这种情况应提示您重新考虑在其中存储文档的方式。我不相信有一个简单的“仅查询”方法来克服这一点。我很乐意被证明是错误的,但:) – Lix

+0

是的,只有演示我想要的,当然数据的结构不是这样的 – Ryo

+0

如果有多个名称属性会发生什么? – Lix

回答

0

眼下 MongoDB的find()仅限于one document level,您可以使用cursor和应用programming logic达到理想的解决方案通过自己的迭代扩展这一功能。

找到更多的信息:

+0

'“限于一个子文档...级别”'?那么find({'content.sub.sub1.name':'Terry'})'?这是一个有效的查询,它可以分解为2个子文档... – Lix

+0

更正:“一个文档级别”表示您必须使用级别1的引用来深入查看。 – theBeacon

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


参考 -

+0

由于这需要对每个文档进行完整的集合扫描和检索,因此这不是一个特别有效的解决方案。 – WiredPrairie

+0

感谢您的支持,我已经在这里测试您的代码与我的数据 http://jsfiddle.net/KS9kH/29/ 但我有问题,代码 返回find_recursive(doc [attr] [i] ); for循环似乎没有与所有的doc [attr]元素循环,它只处理doc [attr]数组的第一个元素并返回,请帮我改正它,谢谢:) – Ryo

+0

为漂亮的数据看,你可以使用这个http://jsonprettyprint.com/ – Ryo