{
"name": "sample_config222",
"data": [
{
"id": 1,
"first_name": "George",
"last_name": "Bluth",
},
{
"id": 2,
"first_name": "Janet",
"last_name": "Bluth",
},
]
}
我想找到文档中与key: value
匹配的所有词典。这是两件事,
使用"name": "sample_config222"
在我们在1
中选择的文档数组中搜索字典。
我尝试了
db.config.find({name: "sample_config"}, {"data": { $elemMatch: { "last_name": "Bluth" } } })
它仅显示一个字典,这是第一个字典
{
"name": "sample_config222",
"data": [
{
"id": 1,
"first_name": "George",
"last_name": "Bluth",
}
}
它也正在从包含"last_name": "Bluth"
的其他文档中获取结果
我尝试使用$and
来显示整个文档。
更新:
类似的问题here使用$elematch
仅返回数组中的一个字典。但是我想获取所有符合查询条件的命令
答案 0 :(得分:1)
您提供的查询,
db.config.find({name: "sample_config"}, {"data": { $elemMatch: { "last_name": "Bluth" } } })
简而言之
data.last_name
等于Bluth
的字段。这里的关键是find
方法采用多个参数。
function (query, fields, limit, skip, batchSize, options)
可以在外壳程序上不带括号的情况下执行find
命令来找到它们。这适用于所有Shell命令,如果您忘记了如何使用命令,则将非常有用。
db.config.find
要获得所需的结果,您需要将查询更改为此:
{name: "sample_config", "data": { $elemMatch: { "last_name": "Bluth" } } }
请注意,我在}
之后删除了"sample_config"
,在{
之前删除了"data"
,使它成为了find
命令的单个查询文档,而不是query
和project
文档。
更新:
我意识到您 还想投影结果文档,因为array字段仅包含匹配的元素。现在,我们只需要将您的原始投影与新查询结合起来
db.col.find({name: "sample_config", "data": { $elemMatch: { "last_name": "Bluth" } } }, {"data": { $elemMatch: { "last_name": "Bluth" } } })
这将返回表单的文件
{
_id: xxx,
data: [
{ id: xxx, first_name: xxx, last_name: "Bluth" }
]
}
但是,根据the docs,这只会返回 first 匹配数组元素,而不是 all 匹配元素。
如果您需要进一步简化数据,我建议使用聚合框架,因为这些运算符更可靠。
可能看起来像
db.col2.aggregate({$match: {name: "sample_config", "data": { $elemMatch: { "last_name": "Bluth" } } }},{$unwind:"$data"},{$match:{"data.last_name": "Bluth"}},{$replaceRoot:{newRoot:"$data"}})
这将导致以下输出
{ "id" : 1, "first_name" : "George", "last_name" : "Bluth" }
{ "id" : 2, "first_name" : "Janet", "last_name" : "Bluth" }
{ "id" : 2, "first_name" : "Janet", "last_name" : "Bluth" }
摘自这些原始文件
{ "_id" : ObjectId("5c5b025fea781cb935c975ae"), "name" : "sample_config", "data" : [ { "id" : 1, "first_name" : "George", "last_name" : "Bluth" }, { "id" : 2, "first_name" : "Janet", "last_name" : "Bluth" } ] }
{ "_id" : ObjectId("5c5b0283ea781cb935c975af"), "name" : "sample_config", "data" : [ { "id" : 1, "first_name" : "George", "last_name" : "Dole" }, { "id" : 2, "first_name" : "Janet", "last_name" : "Bluth" } ] }
{ "_id" : ObjectId("5c5b028bea781cb935c975b0"), "name" : "sample_config", "data" : [ { "id" : 1, "first_name" : "George", "last_name" : "Dole" }, { "id" : 2, "first_name" : "Janet", "last_name" : "Johnson" } ] }
您可以在以下位置找到有关这些运算符的文档: