如何在MongoDB的父对象中搜索子对象?

时间:2019-06-10 04:21:07

标签: mongodb

我试图在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"}});进行搜索时,它不起作用。它只是在第一级搜索。

我无法精确地进行搜索,因为对象/数组的尺寸是动态的,并且可以随时增长或缩小。

感谢您的回答。

1 个答案:

答案 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值并查找具有_idroot_id与此值匹配的所有文档来检索所有相关文档:

db.collection.find({
    $or: [
        {_id: 0},
        {root_id: 0}
    ]

});

查找所有根级文档是在root_id: null上进行匹配的简单问题。

当然,缺点是现在您需要在检索后通过将一个文档的parent_id与另一个文档的_id匹配来手动组装这些文档,因为层次信息已经被抽象掉了。使用$graphLookup可以通过将每个子文档与祖先列表进行匹配来缓解这种情况,但是您仍然需要手动确定嵌套顺序。

无论您如何选择结构前进的文档,如果要查询任意嵌套的内容,都将需要这种重组。我鼓励您考虑不同的可能性,并确定哪种最适合您的特定应用程序需求。

相关问题