Mongodb -Moogose 查询数组字段过滤器
Mongodb -Moogose query array fields filter
我想在聚合:6 且 'value' 大于:1000 且聚合:5 且 'value' 大于:2000 时进行过滤
架构:发布
Query:db.postings.find(
{ agg: {
$elemMatch: {
$and:[
{agg:'5', value: { $gte: '2000'} },
{agg:'6', value: { $gte: '1000'} }
]
}
}}
);
结果:[]空
Collection':
{ "_id":1,
"agg" : [
{ "value" : "2014", "agg" : "5"},
{"value" : "2500","agg" : "6"}
],
}
{
_id:2,
"agg" : [
{ "value" : "2015", "agg" : "5"},
{ "value" : "1000","agg" : "6" }
],
}
how i write query correctly?
你对 $and
的使用让你很不爽。 $and
表示 "I want all documents that match both queries"。说我想要一个值为“5”和“6”的文档是没有意义的agg
,这就是你所说的。
如果您想将 任何 文档与查询中的条件匹配(这将匹配该集合中的两个文档),您只需将 $and
更改为 $or
您似乎需要 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 }
]
}
我想在聚合:6 且 'value' 大于:1000 且聚合:5 且 'value' 大于:2000 时进行过滤 架构:发布
Query:db.postings.find(
{ agg: {
$elemMatch: {
$and:[
{agg:'5', value: { $gte: '2000'} },
{agg:'6', value: { $gte: '1000'} }
]
}
}}
);
结果:[]空
Collection':
{ "_id":1,
"agg" : [
{ "value" : "2014", "agg" : "5"},
{"value" : "2500","agg" : "6"}
],
}
{
_id:2,
"agg" : [
{ "value" : "2015", "agg" : "5"},
{ "value" : "1000","agg" : "6" }
],
}
how i write query correctly?
你对 $and
的使用让你很不爽。 $and
表示 "I want all documents that match both queries"。说我想要一个值为“5”和“6”的文档是没有意义的agg
,这就是你所说的。
如果您想将 任何 文档与查询中的条件匹配(这将匹配该集合中的两个文档),您只需将 $and
更改为 $or
您似乎需要 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 }
]
}