我希望在agg:6和'value'大于:1000并且agg:5和'value'大于:2000时进行过滤 架构:发布
Query:db.postings.find(
{ agg: {
$elemMatch: {
$and:[
{agg:'5', value: { $gte: '2000'} },
{agg:'6', value: { $gte: '1000'} }
]
}
}}
);
结果:[]为空
集“:
{ "_id":1,
"agg" : [
{ "value" : "2014", "agg" : "5"},
{"value" : "2500","agg" : "6"}
],
}
{
_id:2,
"agg" : [
{ "value" : "2015", "agg" : "5"},
{ "value" : "1000","agg" : "6" }
],
}
我如何正确地编写查询?
答案 0 :(得分:1)
看起来您需要agg
数组满足以下条件的文档:
contains a subdocument where agg = "6" and value >= "2000"
AND
contains a subdocument where agg = "5" and value >= "1000"
您的查询适用于agg
子阵列满足以下条件的文档:
contains a subdocument where
agg = "6" and value >= "2000"
AND
agg = "5" and value >= "1000"
正确查询的MongoDB公式是
{
"$and" : [
{ "agg" : { "$elemMatch" : { "agg" : "5", "value" : { "$gte" : "2000" } } } },
{ "agg" : { "$elemMatch" : { "agg" : "6", "value" : { "$gte" : "1000" } } } }
]
}
等同于$all
,
{
"agg" : {
"$all" : [
{ "$elemMatch" : { "agg" : "5", "value" : { "$gte" : "2000" } } },
{ "$elemMatch" : { "agg" : "6", "value" : { "$gte" : "1000" } } }
]
}
}
这个查询匹配这两个文档,我想正如预期的那样。但是,我仍然怀疑你是否正在做你真正想要的事情 - 你确定你希望agg.agg
和agg.value
的值是字符串而不是数字吗?例如,以下文档与查询匹配:
{
"_id" : 3,
"agg" : [
{ "agg" : "5", "value" : "2015" },
{ "agg" : "6", "value" : "potato" }
]
}
本文件不包含:
{
"_id" : 4,
"agg" : [
{ "agg" : "5", "value" : "2015" },
{ "agg" : "6", "value" : 2000 }
]
}
答案 1 :(得分:0)
你使用$and
会让你感到困惑。 $and
说“我想要所有符合两个查询的文档”。我想要一个价值为“5”和“6”的agg
文件是没有意义的。这就是你所说的。
如果您希望将任何文档与查询中的条件匹配(与该集合中的两个文档都匹配),您只需将$and
更改为$or
< / p>