【问题标题】:MongoDB group and find results where value doesn't ocourMongoDB 分组并查找不出现值的结果
【发布时间】:2017-01-30 22:52:01
【问题描述】:

我的数据库中有以下文件:

{
    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
}

我想按 value1 对所有对象进行分组并找到那些没有 value2=true 的对象。

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

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

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
}

【问题讨论】:

  • 不确定你想说什么,但如果你发布了你想要的结果,向你推荐解决方案会更容易。
  • 对于一个特定的value1 有多个value2= true 条目的文档呢?你也想要吗?
  • 它们也可以是结果的一部分,但我只需要它们与 no value2=true 文档

标签: mongodb


【解决方案1】:

您可以尝试以下聚合。这将保留values2 具有至少一个真值或所有values2 为假的所有组

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

【讨论】:

  • 我将if 更改为以下内容:if: { $setEquals: ["$values2", [false]] } 现在我只得到它们,所有值都是假的。这是一个很好的解决方案。我以前不知道这个命令redact。谢谢
  • 我认为这很棒,但并不完全确定要取消它。
猜你喜欢
  • 2021-07-19
  • 2016-02-07
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 2020-09-29
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多