检查范围内的子文档是否符合条件

时间:2018-06-20 15:23:56

标签: mongodb mongodb-query aggregation-framework

我正在处理mongoDB查询。

我有几个文档,查询结果如下:

{
    "_id" : 1000.0,
    "date" : ISODate("2018-05-25T00:20:00.000Z"),
    "value" : true
}

{
    "_id" : 1000.0,
    "date" : ISODate("2018-05-25T00:26:00.000Z"),
    "value" : false
}

{
    "_id" : 1000.0,
    "date" : ISODate("2018-05-25T00:30:00.000Z"),
    "value" : false
}

原始文档经过过滤,因此我只能在 now 之前的15分钟之内获得文档,而无法知道该时间范围内有多少条目。

我需要扩展现有查询,以使其返回基于“值”的状态。如果不为真,我需要状态为 0 ,如果存在至少为1,但不仅为真,我需要状态为 1 ,如果只有 true ,则我需要状态2。

例如:

{
    "_id" : 1000,
    "status" : 1
},
{
    "_id" : 1001,
    "status" : 2
}

是否有一种使用mongoDB完成此操作的方法?还是在Java方面做得更好/更容易?请注意,数据库中有多个_id。

1 个答案:

答案 0 :(得分:0)

您可以将每个组中的所有值收集到一个数组中(使用$group$push),然后使用$switch应用逻辑。要确定数组是否包含任何true值或所有值均为true,可以使用$anyElementTrue$allElementsTrue

db.col.aggregate([
    {
        $group: {
            _id: "$_id",
            values: { $push: "$value" }
        }
    },
    {$unwind:"$values"},
    {
        $project: {
            _id: 1,
            status: {
                $switch: {
                    branches: [
                        { case: { $allElementsTrue: "$values" }, then: 2 },
                        { case: { $anyElementTrue: "$values" }, then: 1 },
                    ],
                    default: 0
                }
            }
        }
    }
])