Mongodb mongo$ne查询,数组未按预期工作

Mongodb mongo$ne查询,数组未按预期工作,mongodb,Mongodb,我正试图使用插入的数据运行以下查询,如下所示。不管出于什么原因,值为0的$ne似乎不起作用。我用v2.0.4在linux和mac上都试过了。还使用mongo shell运行了这些 有人有什么想法吗?这是一个错误还是我误解了什么 db.associated.insert({ "diskinfo" : { "physical" : [ {"merror_count" : "Count: 0"},

我正试图使用插入的数据运行以下查询,如下所示。不管出于什么原因,值为0的$ne似乎不起作用。我用v2.0.4在linux和mac上都试过了。还使用mongo shell运行了这些

有人有什么想法吗?这是一个错误还是我误解了什么

db.associated.insert({
    "diskinfo" : {
            "physical" : [
                    {"merror_count" : "Count: 0"},
                    {"merror_count" : "Count: 0"},
                    {"merror_count" : "Count: 0"},
                    {"merror_count" : "Count: 509"}
            ]
    }})

db.associated.insert({
    "diskinfo" : {
            "physical" : [
                    {"merror_count" : "Count: 0"},
                    {"merror_count" : "Count: 5"},
                    {"merror_count" : "Count: 0"}
            ]
    }})

db.associated.insert({
    "diskinfo" : {
            "physical" : [
                    {"merror_count" : "Count: 0"},
                    {"merror_count" : "Count: 0"},
                    {"merror_count" : "Count: 0"}
            ]
    }})

在mongo shell上运行这些查询。并在评论中得到了结果

db.associated.find( { "diskinfo.physical.merror_count" : { $ne : 'Count: 0'}}).count() // Result: 0, Expected: 2 db.associated.find( { "diskinfo.physical.merror_count" : { $ne : 'Count: 509'}}).count() // Result: 2, Expected: 2 db.associated.find( { "diskinfo.physical.merror_count" : { $ne : 'Count: 5'}}).count() // Result: 2, Expected: 2 db.associated.find({“diskinfo.physical.merror_count”:{$ne:'count:0'}).count() //结果:0,预期值:2 db.associated.find({“diskinfo.physical.merror_count”:{$ne:'count:509'}).count() //结果:2,预期:2 db.associated.find({“diskinfo.physical.merror_count”:{$ne:'count:5'}).count() //结果:2,预期:2
这些结果是正确的

您的期望可能基于嵌入数组中与谓词匹配的元素数。但是,满足查询的文档数量将返回

在第一种情况下,您查询的所有文档的diskinfo.physical.merror_计数不等于“计数:0”。每个文档都有diskinfo.physical.merror_计数,即“计数:0”,因此返回0

这样看,集合中的每个文档都有一个diskinfo.physical.merror_count值,它不是“count:0”。如果你用平等而不是不平等来提问,你会得到这三个答案

您是否正在尝试查找只有“计数:0”项的所有文档

似乎没有一种直接的方法可以做到这一点,但有一个查询可以让您了解这一点:

db.associated.find({“diskinfo.physical.merror_count”){$gt:'count:0'}).count()


如果计数实际上是整数,至少这是一个解决方案-它碰巧也适用于字符串,因为“1”>“0”等。另一个解决方案是使用:

find({“diskinfo.physical”:{$elemMatch:{merror_count:{$ne:'count:0'}})
这将匹配一个数组,其中只有一个项是
$ne
。另一个优点是,您可以向匹配中添加更多运算符,以执行以下复杂操作:

查找({
'partners.id':'C30016',
“合作伙伴”:{$elemMatch:{
id:{$ne:'C30016'},
类型:“发货人”
}
} 
})

(找到帐户“C30016”的所有合作伙伴,他们都是发货人)。

虽然这是一个老问题,但我认为对于$ne和数组的语义,还有一些额外的解释

  • 众所周知,mongo的行为与表单的查询有关

    db.collection.find({a:v})

  • 当a是数组时:它返回所有文档,使得(至少)数组键中的一个元素为v。在本例中:

    db.associated.find({"diskinfo.physical.merror_count" : "Count: 0"}).count()
    
    返回3,因为数组“diskinfo.physical.merror_count”在集合的三个文档中包含值“count:0”

  • 那么,期望这样做似乎是合理的(至少是可能的)

    db.collection.find({a:{$ne:v}})

    将返回文档,使a包含与v不同的内容。 但是,这不是Mongo中的行为。相反,使用$ne表示仅选择数组a不包含v的文档

  • <>这个语义在开始时看起来很奇怪,但是如果我们用这样的方式表达:

    ,这是有意义的。
     db.collection.find({a:v}).count() + db.collection.find({a:{$ne:v}}).count()
    
    返回集合中元素的总数

    db.associated.find({"diskinfo.physical.merror_count" : {$ne: "Count: 0"}}).count()
    
    返回0,因为数组“diskinfo.physical.merror_count”在集合的3个文档中至少包含一次“count:0”