我有这些文件:
//document 1
{
info : [
{
id : 100,
field : {
a : 1,
b : 2
}
},
{
id : 200,
field : {
a : 3,
b : 4
}
},
{
id : 300,
field : {
a : 5,
b : 6
}
}
]
},
//document 2
{
info : [
{
id : 400,
field : {
a : 7,
b : 8
}
},
{
id : 500,
field : {
a : 9,
b : 10
}
}
]
}
我需要找到值为field.a = 7和field.b = 8的子文档的id,这意味着id值为400.
我试过的是$ elemMatch,但我无法得到结果。
我的尝试:
尝试1:
db.mycollection.findOne({info : {$elemMatch : { 'field.$.a':7,'field.$.b':8 } } });
尝试2:
db.mycollection.findOne({info:{$elemMatch:{$elemMatch:{'field.$.a':7,'field.$.b':8,}}}});
尝试3:
db.mycollection.findOne({info:{$elemMatch:{$elemMatch:{'field.a.$':7,'field.b.$':8,}}}});
尝试4:
db.mycollection.findOne({info:{$elemMatch:{'field.$.a':7,'field.$.b':8,}}});
答案 0 :(得分:1)
$elemMatch
运算符就像它对其所处理的指定数组元素的“迷你查询”一样工作,因此参数进入内部。此外positional $
运算符是“投影”的概念,而不是查询文档本身,因此这是一个单独的元素:
db.mycollection.find(
{
"info": {
"$elemMatch": { "field.a": 7 , "field.b": 8 }
}
},
{ "info.$": 1 }
)
两者都匹配包含匹配元素的文档,然后由于投影而仅返回匹配的元素:
{
"_id" : ObjectId("564d52979f28c6e0feabceee"),
"info" : [
{
"id" : 400,
"field" : {
"a" : 7,
"b" : 8
}
}
]
}