8

例如我们有收藏

{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/})
4

2 回答 2

5

问题是:

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

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

所以不,您必须使用点表示法,除非您正在搜索一个对象与另一个对象完全相等的位置。

话虽如此,您可以将文档包装在$elemMatchhttp ://docs.mongodb.org/manual/reference/operator/elemMatch/中

编辑

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

于 2013-04-19T13:11:35.793 回答
0

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

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

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

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

$match: {
    subfield: /regex/
}

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

$replaceRoot: {
    newRoot: "$_root"
}

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

于 2021-07-22T13:35:56.167 回答