Mongodb -Moogose查询数组字段过滤器

时间:2015-04-01 16:53:02

标签: mongodb mongoose

我希望在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" }
    ],
}
  

我如何正确地编写查询?

2 个答案:

答案 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.aggagg.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>

相关问题