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

如何在不同深度内搜索MongoDB嵌套子文档,mongodb,nested,mongodb-query,subdocument,Mongodb,Nested,Mongodb Query,Subdocument,我在MongoDB中有一些子文档,偶尔包含不同的类型-字符串、另一个子文档、另一嵌套子文档等。 我正在尝试构建一个查询,该查询将在此子文档内容中进行搜索,而不管其类型如何 鉴于下列文件: { name: "test1", content: "test contents"} { name: "test2", content: {family: "tests family content", last: "another test content"} } { name: "test3", conte

我在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'}}
]}

是否可以创建一个查询,一次迭代所有嵌套字符串\deep?

这里您缺少
$regex
中的
$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"
    }
    }
}]

这里缺少
$regex
中的
$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"
    }
    }
}]

很不清楚你在问什么。请阅读一个好的问题,并使用来改进您的问题。尝试编辑标题、介绍和问题,希望现在更好…顺便说一句,同时,作为一种解决方法,我正在询问用户希望搜索的深度。否则,也可以创建3个不同的查询,然后稍后检查答案。不清楚您在问什么。请阅读一个好的问题,并使用来改进您的问题。尝试编辑标题、介绍和问题,希望现在更好…顺便说一句,同时,作为一种解决方法,我正在询问用户希望搜索的深度。否则,也可以创建3个不同的查询,然后稍后检查答案。您是对的,但这只是写问题时的一个输入错误,不幸的是,它不能解决问题。@Do5您想要什么确切的输出?我希望能够在“内容”中的所有可能字段中搜索字符串。输出结构不太相关,可能是整个文档,只有相关字段或相关子文档,这不重要。您得到的输出很好,但出于某种原因,我没有得到它,我只得到第三个-test3这对我来说真是一个悲伤的故事。。。我再次检查了这个特定的文档和查询。哇!它确实返回了你写的所有记录!然后,我回到我的应用程序,发现它一直都在工作我只是有很多文档和很长的输出,为了看它,我应该键入“it”…你是对的,但那只是写问题时的一个输入错误,不幸的是,它不能解决问题。@Do5您想要什么确切的输出?我希望能够在“内容”中的所有可能字段中搜索字符串。输出结构不太相关,可能是整个文档,只有相关字段或相关子文档,这不重要。您得到的输出很好,但出于某种原因,我没有得到它,我只得到第三个-test3这对我来说真是一个悲伤的故事。。。我再次检查了这个特定的文档和查询。哇!它确实返回了你写的所有记录!然后,我回到我的应用程序,发现它真的一直在工作,我只是有很多文档和一个很长的输出,要看它,我应该键入“it”。。。