我正在处理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。
答案 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
}
}
}
}
])