Mongo:找到没有点表示法的子文档

时间:2013-04-19 12:21:22

标签: mongodb

例如我们有集合

{field: {subfield: 'name'}}
{field: {subfield: 'phone'}}

我可以找到没有点符号的文档吗?喜欢这个

db.test.find({field: {subfield: /regex/}})

或者可能是这样的

db.test.find({field: {$someOperator: {subfield: /regex/}}})

我只是不想像

那样构建点符号
db.test.find({"field.subfield": /regex/})

2 个答案:

答案 0 :(得分:5)

问题在于:

db.test.find({field: {$someOperator: {subfield: /regex/}}})

实际上是在MongoDB中查询的另一种方法,它使用对象euqality来搜索子文档。

所以不,你必须使用点表示法,除非你在寻找一个物体与另一个物体完全相等的位置。

话虽如此,你可以将文件包装在$elemMatchhttp://docs.mongodb.org/manual/reference/operator/elemMatch/中,这样可行吗

修改

考虑到您的集合结构$elemMatch实际上不起作用。

答案 1 :(得分:0)

是的,这可以使用聚合管道实现。

首先,使用 $replaceRoot 将根文档移动到子文档。另外,将根文档($$ROOT)保留在一个字段中,以便稍后输出。

$replaceRoot: {
    newRoot: {
        $mergeObjects: [{
                _root: "$$ROOT"
            },
            "$field"
        ]
    }
}

接下来,使用 $match 对子文档执行查询。

$match: {
    subfield: /regex/
}

最后,使用 $replaceRoot 将根设置回整个文档。

$replaceRoot: {
    newRoot: "$_root"
}

我不认为这会非常高效,但它有效。