2013-10-08 56 views
1

我在MongoDB中存储了一些树状结构的数据。它看起来像这样:在MongoDB中选择树的一部分

{ 
    "_id": 1, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "baz" 
     }, 
     { 
      "name": "gizmo" 
     }] 
    }] 
} 
{ 
    "_id": 2, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "gizmo" 
     }] 
    }] 
} 

我想在子树上查询,并希望只提取匹配查询树的部分。在每个节点中,最多只有一个与查询匹配的子树。

在这个测试查询中,我想找到匹配路径“foo/bar/gizmo”的树的部分。所以,我曾尝试以下:

db.Test.find({ 
    name: "foo", 
    subs: { 
     $elemMatch: { 
      name: "bar", 
      subs: { 
       $elemMatch: { 
        name: "gizmo" 
       } 
      } 
     } 
    } 
}, 
{ 
    "subs.subs": { 
     $slice: 1 
    } 
}) 

结果我得到的是

{ 
    "_id": 1, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "baz" 
     }] 
    }] 
}{ 
    "_id": 2, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "gizmo" 
     }] 
    }] 
} 

,而我其实是想

{ 
    "_id": 1, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "gizmo" 
     }] 
    }] 
}{ 
    "_id": 2, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "gizmo" 
     }] 
    }] 
} 

是否有可能做到这一点?我曾尝试在子树上使用$elemMatch投影算子,但似乎目前Mongo不支持(不能在嵌套字段上使用$ elemMatch投影(当前不支持))。

+0

数组不能给予的MongoDB多的爱。你需要重组你的文件。 – WiredPrairie

回答

0

您可以使用Aggregation Framework根据需要获取结果。试试下面的代码:

db.Test.aggregate(
{$unwind : "$subs"}, 
{$unwind : "$subs.subs"}, 
{$match : {name : "foo", "subs.name" : "bar", "subs.subs.name" : "gizmo"}} 
); 

结果会是这样的:阵列内的

"result" : [ 
    { 
     "_id" : ObjectId("52540da2e3a2c44e082642d4"), 
     "name" : "foo", 
     "subs" : { 
      "name" : "bar", 
      "subs" : { 
       "name" : "gizmo" 
      } 
     } 
    }, 
    { 
     "_id" : ObjectId("52540dd6e3a2c44e082642d5"), 
     "name" : "foo", 
     "subs" : { 
      "name" : "bar", 
      "subs" : { 
       "name" : "gizmo" 
      } 
     } 
    } 
]