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.aggagg.value 的值是字符串而不是数字吗?例如,以下文档匹配查询:

{
    "_id" : 3,
    "agg" : [
        { "agg" : "5", "value" : "2015" },
        { "agg" : "6", "value" : "potato" }
    ]
}

本文档没有:

{
    "_id" : 4,
    "agg" : [
        { "agg" : "5", "value" : "2015" },
        { "agg" : "6", "value" : 2000 }
    ]
}