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

时间:2015-09-11 10:48:55

标签: mongodb nested mongodb-query subdocument

我在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的查询?

1 个答案:

答案 0 :(得分:0)

您在$or中缺少$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"
    }
    }
}]