【问题标题】:Boolean aggreagte in MongoDB arrayMongoDB数组中的布尔聚合
【发布时间】:2017-12-13 09:23:30
【问题描述】:

我有一个如下所示的 JSON 文档

[
{a: "v1",b: "v2",c: "v3",d: [{k1: true},{k2: true},{k3: false}]},
{a: "v1",b: "v2",c: "v7",d: [{k1: false},{k2: true},{k3: false}]},
{a: "v8",b: "v9",c: "v3",d: [{k1: false},{k2: true},{k3: true},{k4: false}]},
{a: "v5",b: "v2",c: "v10",d: [{k1: false},{k2: true},{k3: false}]}
]

我想写如下所示的查询:

select d from the above docs
where a = v1
and b = v2

预期的结果将是以下两个文件:

{a: "v1",b: "v2",c: "v3",d: [{k1: true},{k2: true},{k3: false}]},
{a: "v1",b: "v2",c: "v7",d: [{k1: false},{k2: true},{k3: false}]}

到目前为止,这很容易。下面的查询会给你结果:

db.audit.find({a:"v1", b:"v2"},{d:1,_id:0}).pretty()

问题-

现在的要求是在检索到的文档之间进行布尔运算。 “或”布尔运算应该是对“d”键的数组元素的子文档中找到的各个键(k1、k2、k3等)的值。

如果密钥不存在,则假定它为假。

在 MongoDB 中有这样做的吗?

通过将 d 分配给变量然后比较它很容易以编程方式进行,但我正在尝试查找 MongoDB 是否可以直接执行此操作。

提前致谢。

谢谢 奥罗

【问题讨论】:

    标签: arrays mongodb boolean


    【解决方案1】:

    在 mongodb 3.6 中你可以这样做

    db.bool.aggregate(
        [
            {
                $match: {
                   a:"v1", b:"v2"
                }
            },
            {
               $project:{
                 d:{
                  $map:{
                    input:"$d",
                    as:"do",
                    in:{$arrayElemAt:[{$objectToArray:"$$do"},0]}
                  }
                 }
               }
            },
            {
              $unwind:"$d"
            },
            {
             $replaceRoot:{
              newRoot:"$d"
             }
            },
            {
              $group:{
                _id:"$k",res:{$addToSet:"$v"}
              }
            },
            {
             $project:{
              k:"$_id",
              v:{$or:"$res"},
              _id:0
             }
            },
            {
              $group:{
                _id:null,
                res:{$push:"$$ROOT"}
              }
            },
            {
            $project:{ _id:0,
             res:{$arrayToObject :"$res"}
            }
            }
    
    
    
        ]
    );
    

    【讨论】:

    • 但是这里我们缺少与单个键的比较。要求是比较过滤文档中的各个键。
    • 预期的答案应该是:{ "result" : [ { "k1" : true }, { "k2" : true }, { "k3" : false } ] }
    • 你能解释一下你的问题吗?
    • 您是说如果任何键具有真值,则应返回该文档?
    • 输出应该是单个文档。在这种情况下,它应该是 { "result" : [ { "k1" : true }, { "k2" : true }, { "k3" : false } ] } 仔细检查 - 首先我们从四个文档中筛选出两个文档。然后我们需要对“d”的各个键(k1 与 k1,k2 与 k2 等等)进行布尔比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2019-09-28
    • 2021-04-28
    • 2014-12-01
    • 2021-11-20
    相关资源
    最近更新 更多