如何在不同深度内搜索 MongoDB 嵌套子文档

Posted

技术标签:

【中文标题】如何在不同深度内搜索 MongoDB 嵌套子文档【英文标题】:How to Search MongoDB Nested Subdocuments Within Different Deeps 【发布时间】:2015-12-07 21:48:35 【问题描述】:

我在 MongoDB 中有一些子文档,其中偶尔包含不同的类型 - 字符串、另一个子文档、另一个嵌套子文档等。 我正在尝试构建一个查询,该查询将在此子文档内容中进行搜索,无论其类型如何。

鉴于以下文件:

 name: "test1", content: "test contents"
 name: "test2", content: family: "tests family content", last: "another test content" 
 name: "test3", content: subdocument: family: "super family contents", last: "last test content"  

我想使用在所有文档和子文档中的所有字符串中进行搜索的查询。 已经尝试过以下查询,但它只返回子文档的最嵌套级别 - content.subdocument.family

 $or: [
    "content": '$regex': '.*conten.*', '$options': 'i',
    "content.family": '$regex': '.*conten.*', '$options': 'i',
    "content.last": '$regex': '.*conten.*', '$options': 'i',
    "content.subdocument.family": '$regex': '.*conten.*', '$options': 'i',
    "content.subdocument.last": '$regex': '.*conten.*', '$options': 'i'
]

是否可以创建一个一次性遍历所有嵌套字符串\deeps 的查询?

【问题讨论】:

很不清楚你在问什么。请阅读how to ask 一个好问题并使用edit link 来改进您的问题。 试图编辑标题、简介和问题,希望现在更好... 顺便说一句,与此同时,作为一种解决方法,我正在询问用户他想要搜索的深度。否则,也可以创建 3 个不同的查询,然后稍后检查答案 【参考方案1】:

这里您在$regex 中缺少$or 的语法。您应该使用$or,如下所示:

db.collection.find(
    $or: [
    "content": 
        '$regex': '.*conten.*',
        '$options': 'i'
    
    , 
    "content.family": 
        '$regex': '.*conten.*',
        '$options': 'i'
    
    , 
    "content.last": 
        '$regex': '.*conten.*',
        '$options': 'i'
    
    , 
    "content.subdocument.family": 
        '$regex': '.*conten.*',
        '$options': 'i'
    
    , 
    "content.subdocument.last": 
        '$regex': '.*conten.*',
        '$options': 'i'
    
    ]
)

编辑:

以上查询给出以下结果:

[
    "_id": ObjectId("55f41b6aef4766c946112a2d"),
    "name": "test1",
    "content": "test contents"
, 
    "_id": ObjectId("55f41b6aef4766c946112a2e"),
    "name": "test2",
    "content": 
    "family": "tests family content",
    "last": "another test content"
    
, 
    "_id": ObjectId("55f41b6aef4766c946112a2f"),
    "name": "test3",
    "content": 
    "subdocument": 
        "family": "super family contents",
        "last": "last test content"
    
    
]

【讨论】:

你是对的,但这只是写问题时的一个错字,不幸的是它并没有解决问题。 @Do5 你想要什么确切的输出? 我希望能够在“内容”内的所有可能字段中搜索字符串。输出结构的相关性较低,可能是整个文档,仅相关字段或仅相关子文档,没关系 你得到的输出很好,但由于某种原因我没有得到它,我只得到第三个 - test3 这对我来说是一个非常悲伤的故事......我再次检查了这个特定的文档和查询。哇!它确实返回了你写的所有记录!然后,我回到我的应用程序,发现它一直在工作,我只是有很多文档和很长的输出,要观看它,我应该输入“它”......

以上是关于如何在不同深度内搜索 MongoDB 嵌套子文档的主要内容,如果未能解决你的问题,请参考以下文章

使用 arrayFilters 更新 MongoDB 中的嵌套子文档

匹配 MongoDB 中嵌套子文档的嵌套数组

mongodb中在嵌套子文档的文档上面建立索引

MongoDB聚合查询 - 返回嵌套子文档中的所有项目

Mongodb $pull 执行从嵌套子数组中删除 ObjectId("... id") 。

聚合查询从嵌套子文档中获取最新元素的计数