如何在mongodb中使用`expr`编写复杂的查询?

亚历克斯·朱可夫斯基(Alex Zhukovskiy)

我正在尝试向MongoDB写一些复杂的查询,老实说我不知道​​如何正确地编写它。在SQL伪代码中,它类似于:

SELECT *
FROM Something
WHERE 
   (IF Item.NestedItem THEN NULL ELSE Item.NestedItem.Id) == 'f4421f9e-5962-4c68-8049-a45600f36f4b'
OR (IF Item.NestedItem THEN NULL ELSE Item.NestedItem.OtherId) == 'd6b799dc-f464-4919-8435-a7b600cc408a'

我成功地将IF编写为

{ "$cond" : [{ "$eq" : ["$Item.NestedItem", null] }, null, "$Item.NestedItem.Id"] }
{ "$cond" : [{ "$eq" : ["$Item.NestedItem", null] }, null, "$Item.NestedItem.OtherId"] }

但是现在我不确定如何将它们与常量进行比较然后加入。我正在尝试将类似SQL的语言编写为MongoDb,这是我无法翻译的查询示例。我想要类似的东西

{ "$and" : 
    { "$eq" : { "$cond" : [{ "$eq" : ["$Item.NestedItem", null] }, null, "$Item.NestedItem.Id"] }, "f4421f9e-5962-4c68-8049-a45600f36f4b" },
    { "$eq" : { "$cond" : [{ "$eq" : ["$Item.NestedItem", null] }, null, "$Item.NestedItem.OtherId"] }, "d6b799dc-f464-4919-8435-a7b600cc408a" } }

但这是一个无效的查询

土生的

$ COND是一个聚合的表情,你需要使用$ EXPR之前$and的操作,在您的SQL查询你的用户OR在查询$和$以这样或更新只

  • $eq之后的更正语法$or
db.collection.aggregate([
  {
    $match: {
      $expr: {
        $or: [
          {
            $eq: [
              {
                $cond: [
                  { $eq: ["$Item.NestedItem", null] }, 
                  null, 
                  "$Item.NestedItem.Id"
                ]
              },
              "f4421f9e-5962-4c68-8049-a45600f36f4b"
            ]
          },
          {
            $eq: [
              {
                $cond: [
                  { $eq: ["$Item.NestedItem", null] },
                  null,
                  "$Item.NestedItem.OtherId"
                ]
              },
              "d6b799dc-f464-4919-8435-a7b600cc408a"
            ]
          }
        ]
      }
    }
  }
])

操场

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章