我试图在MongoDB集合中具有任何级别的任何对象内搜索与“名称”参数匹配的任何值。
我的BSON看起来像这样:
{
"name": "a",
"sub": {
"name": "b",
"sub": {
"name": "c",
"sub": [{
"name": "d"
},{
"name": "e",
"sub": {
"name": "f"
}
}]
}
}
}
我已经用db.collection.createIndex({"name": "text"});
创建了一个索引,它似乎可以工作,因为它创建了多个索引。
{
"numIndexesBefore" : 1,
"numIndexesAfter" : 6,
"note" : "all indexes already exist",
"ok" : 1
}
但是,当我使用此db.collection.find({$text: {$search : "b"}});
进行搜索时,它不起作用。它只是在第一级搜索。
我无法精确地进行搜索,因为对象/数组的尺寸是动态的,并且可以随时增长或缩小。
感谢您的回答。
答案 0 :(得分:0)
MongoDB无法在任意嵌套的对象上建立索引。索引仅在指定的深度发生。对于您而言,$text
搜索将仅检查顶级name
字段,而不检查任何嵌套子文档的name
字段。这是索引编制的固有限制。
据我所知,MongoDB不支持处理此类深度嵌套的数据结构。您确实需要将数据分成单独的文档才能正确处理。例如,您可以将其分解为以下内容:
[
{
"_id": 0,
"name": "a",
"root_id": null,
"parent_id": null
},
{
"_id": 1,
"name": "b",
"root_id": 0,
"parent_id": 0
},
{
"_id": 2,
"name": "c",
"root_id": 0,
"parent_id": 1
},
{
"_id": 3,
"name": "d",
"root_id": 0,
"parent_id": 2
},
{
"_id": 4,
"name": "e",
"root_id": 0,
"parent_id": 2
},
{
"_id": 5,
"name": "f",
"root_id": 0,
"parent_id": 4
}
]
在上述结构中,我们的原始查询db.collection.find({$text: {$search : "b"}});
现在将返回以下文档:
{
"_id": 1,
"name": "b",
"root_id": 0,
"parent_id": 0
}
在这里,我们可以通过检索root_id
值并查找具有_id
或root_id
与此值匹配的所有文档来检索所有相关文档:
db.collection.find({
$or: [
{_id: 0},
{root_id: 0}
]
});
查找所有根级文档是在root_id: null
上进行匹配的简单问题。
当然,缺点是现在您需要在检索后通过将一个文档的parent_id
与另一个文档的_id
匹配来手动组装这些文档,因为层次信息已经被抽象掉了。使用$graphLookup
可以通过将每个子文档与祖先列表进行匹配来缓解这种情况,但是您仍然需要手动确定嵌套顺序。
无论您如何选择结构前进的文档,如果要查询任意嵌套的内容,都将需要这种重组。我鼓励您考虑不同的可能性,并确定哪种最适合您的特定应用程序需求。