MongoDB - 搜索文档的嵌套对象

时间:2016-11-03 12:16:11

标签: mongodb

我的documents collectionfoo相似。这些documents可以有一个嵌套的parent对象,也可以有一个嵌套的parent对象等等。

foo: {
    caption: "Italian",
    code: "",
    id: 17,
    parent: {
       caption: "Restaurants",
       code: "",
       id: 9,
       parent: {
          caption: "Food and Drink",
          code: "food_and_drink",
          id: 1,
          parent: ""
      }
   }
};

如何在foo.parent.id及其所有嵌套parent对象(如果有)中搜索数学?我应该使用$in吗?递归?

2 个答案:

答案 0 :(得分:1)

您可以为方法find(...)提供一个自定义函数,该函数将检查嵌套级别。

实施例

 db.collection.find(
  function () {
    var findKey = "find-this",
        findVal = "please find me";

    function inspectObj(doc) {
      return Object.keys(doc).some(function(key) {
        if ( typeof(doc[key]) == "object" ) {
          return inspectObj(doc[key]);
        } else {
          return ( key == findKey && doc[key] == findVal );
        }
      });
    }
    return inspectObj(this);
  }
)

要查看

StackOverflow: How to find MongoDB field name at arbitrary depth

答案 1 :(得分:0)

是的,你必须使用递归,下面的代码对你非常有帮助,试试这个

    db.getCollection('foo').find().
      forEach(function(x) {
          function t(x){
               if (x.parent) {
                 t(x.parent);
               } else {
                 print(x.caption);
               }
         } 
         t(x)
     });

您将获得所有文档的最后一个父级,并获取该父级的任何字段而不是标题 我使用了caption

如果上面的代码无效,请进行一些小改动

if(x.parent != "") instead of if(x.parent)