如何将带exist的sql查询转换为mongodb查询

sdnqo3pr  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(454)

我有两个关于mongodb的文件,分别是百分比和项目。我擅长sql,我可以写plsql查询如下,但我不能转换为mongodb查询。因为我的mongodb知识水平才刚刚起步。
事实上,我知道我必须使用$gt的和条件。但是我不知道我怎么能说mongodb的notexists或者union关键字。如何编写mongodb查询?我应该搜索哪些关键字?

select p.*, "to_top" as list 
  from percentages p
 where p.percentage > 5
   and p.updatetime > sysdate - 1/24
   and not exists (select 1
                     from items i
                    where i.id = p.p_id
                      and i.seller = p.seller)
 order by p.percentage desc
union
select p2.*, "to_bottom" as list 
  from percentages p2
 where p2.percentage > 5
   and p2.updatetime > sysdate - 1/24
   and exists (select 1
                  from items i2
                 where i2.id = p2.p_id
                   and i2.seller = p2.seller)
order by p2.percentage desc
3xiyfsfu

3xiyfsfu1#

根本没有 UNION 对于mongodb。幸运的是,每个查询都在同一个集合上执行,并且条件非常接近,所以我们可以实现“mongo-way”查询。

解释

通常,所有复杂的sql查询都是通过mongodb聚合框架完成的。
我们筛选文档的依据 percentage / updatetime . 解释为什么我们需要使用 $expr sql联接/子查询是使用$lookup运算符完成的。
sql语句 SYSDATE 在mongodb中 NOW 或者 CLUSTER_TIME 变量。

db.percentages.aggregate([
  {
    $match: {
      percentage: { $gt: 5 },
      $expr: {
        $gt: [
          "$updatetime",
          {
            $subtract: [
              ISODate("2020-06-14T13:00:00Z"), //Change to $$NOW or $$CLUSTER_TIME
              3600000
            ]
          }
        ]
      }
    }
  },
  {
    $lookup: {
      from: "items",
      let: {
        p_id: "$p_id",
        seller: "$seller"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                {
                  $eq: [ "$$p_id", "$id"]
                },
                {
                  $eq: [ "$$seller", "$seller"]
                }
              ]
            }
          }
        },
        {
          $limit: 1
        }
      ],
      as: "items"
    }
  },
  {
    $addFields: {
      list: {
        $cond: [
          {
            $eq: [{$size: "$items"}, 0]
          },
          "$to_top",
          "$to_bottom"
        ]
      },
      items: "$$REMOVE"
    }
  },
  {
    $sort: { percentage: -1 }
  }
])

mongoplayground公司
注意:mongodb聚合有$facet操作符,允许对同一集合执行不同的查询。
架构:

db.percentages.aggregate([
  {$facet:{
    q1:[...],
    q2:[...],
  }},
  //We apply "UNION" the result documents for each pipeline into single array
  {$project:{
    data:{$concatArrays:["$q1","$q2"]}
  }},
  //Flatten array into single object
  {$unwind:"$data"}
  //Replace top-level document
  {$replaceWith:"$data"}
])

mongoplayground公司

4uqofj5v

4uqofj5v2#

为什么不将mangodb数据导入oracle并使用sql(这比mango更简单、更强大)

相关问题