2017-01-30 42 views
0

我在我的分贝以下文件:MongoDB的组和发现结果,其中值不ocour

{ 
    id: ObjectId(...), 
    value1: 0, 
    value2: false 
}, { 
    id: ObjectId(...), 
    value1: 0, 
    value2: true 
}, { 
    id: ObjectId(...), 
    value1: 1, 
    value2: false 
}, { 
    id: ObjectId(...), 
    value1: 1, 
    value2: false 
}, { 
    id: ObjectId(...), 
    value1: 1, 
    value2: false 
} 

我想按值1的所有对象,发现那些不具有值2 =真正。

查看value1 = 0的对象。 您可以看到存在一个value2 = true的文档。

对于value1 = 1,不存在具有value2 = true的文档。
我想拥有所有这个value1,我没有value2 = true。

db.getCollection('collection').aggregate([ 
    {$group: {_id: {'value1': '$value1', 'value2' : '$value2'}, count: {$sum:1}}}, 
    {$match: {'_id.value2': true, count: {$eq: 0}}} 
]) 

我试过这个,但是这找不到任何东西。
因为我滤除了真正的值。所以没有什么可以数。

我希望你能理解我并能帮助我。


编辑1 - 我想要的结果:
我想类似的东西:

{ 
    value1: 0, 
    count: 1 // value1=0 has exactly 1 document with value2=true 
}, { 
    value1: 1, // <-- Im just interested in this values which has the count of 0 
    count: 0 // <-- value1=1 has NO documents with value2=true 
} 
+1

不知道你有什么想说的,但如果你发布你想要的结果,它会更容易建议你解决。 – Saleem

+0

对于特定的'value1',具有多个'value2 = true'条目的文档呢?你也想要吗? – Veeram

+0

他们也可以是结果的一部分,但我需要的是** no ** value2 = true文档 – Sammy

回答

1

你可以试试下面聚集。这将让所有的组,其中values2有ATLEAST一个真实价值或全部values2都是假的

db.collection.aggregate([{ 
    $group: { 
     _id: "$value1", 
     values2: { 
      $push: "$value2" 
     } 
    } 
}, { 
    $redact: { 
     $cond: { 
      if: { 
       $or: [{ 
        $anyElementTrue: ["$values2"] 
       }, { 
        $setEquals: ["$values2", [false]] 
       }] 
      }, 
      then: "$$KEEP", 
      else: "$$PRUNE" 
     } 
    } 
}]) 
+0

我将'if'更改为以下内容:if:{$ setEquals:[“$ values2” ,[false]]}'现在我只得到他们所有的值都是假的。这是一个很好的解决方案。我以前不知道这个命令'redact'。谢谢 – Sammy

+0

真棒这就是我的想法,但并不完全肯定要把它关掉。 – Veeram