mongodb聚合管道运算符转换为springboot代码片段示例

Aggregation Pipeline Operators to spring-boot-starter-data-mongodb
mongodb聚合管道运算符转换为对应的spring-boot-starter-data-mongodb代码片段
操作符及案例对应官方文档目录顺序和内容,除第一个示例外不在给出文档和结果,仅显示聚合操作(有错误请随时指出)
官网文档地址
中文文档地址
贡献代码

mongodb聚合管道运算符

$abs

$abs中文文档链接
集合ratings包含以下文档:

{ _id: 1, start: 5, end: 8 }
{ _id: 2, start: 4, end: 4 }
{ _id: 3, start: 9, end: 7 }
{ _id: 4, start: 6, end: 7 }

以下示例计算start和end等级之间的差异的大小:

db.ratings.aggregate([
   {
     $project: { delta: { $abs: { $subtract: [ "$start", "$end" ] } } }
   }
])

该操作返回以下结果:

{ "_id" : 1, "delta" : 3 }
{ "_id" : 2, "delta" : 0 }
{ "_id" : 3, "delta" : 2 }
{ "_id" : 4, "delta" : 1 }

spring-boot

ProjectionOperation projection = Aggregation.project()
                    .and(ArithmeticOperators.Abs.absoluteValueOf(
                            ArithmeticOperators.Subtract.valueOf("start").subtract("end")))
                    .as("delta");

$add

  1. 以下聚合使用$project管道中的$add表达式来计算总费用:
db.sales.aggregate(
   [
     { $project: { item: 1, total: { $add: [ "$price", "$fee" ] } } }
   ]
)
ProjectionOperation projection = Aggregation.project("item")
                    .and(ArithmeticOperators.Add.valueOf("price").add("fee"))
                    .as("total");
  1. 以下汇总使用$add表达式,通过将32460*60000毫秒(即 3 天)添加到date字段来计算billing_date
db.sales.aggregate(
   [
     { $project: { item: 1, billing_date: { $add: [ "$date", 3*24*60*60000 ] } } }
   ]
)
ProjectionOperation projection = Aggregation.project("item")
                    .and(ArithmeticOperators.Add.valueOf("date").add(3 * 24 * 60 * 60000))
                    .as("billing_date");

$addToSet

date字段的日期和年份对文档进行分组,以下操作使用$addToSet累加器计算每个组出售的唯一商品的列表:

db.sales.aggregate(
   [
     {
       $group:
         {
           _id: { day: { $dayOfYear: "$date"}, year: { $year: "$date" } },
           itemsSold: { $addToSet: "$item" }
         }
     }
   ]
)
这个写法暂未找到合适的springboot写法,有会的欢迎留言

$allElementsTrue

以下操作使用$allElementsTrue运算符确定responses数组是否仅包含评估为true的值:

db.survey.aggregate(
   [
     { $project: { responses: 1, isAllTrue: { $allElementsTrue: [ "$responses" ] }, _id: 0 } }
   ]
)
ProjectionOperation projection = Aggregation.project("responses")
                    .and(SetOperators.AllElementsTrue.arrayAsSet("responses")).as("isAllTrue")
                    .andExclude(Fields.UNDERSCORE_ID);

$and

以下操作使用$and运算符确定qty是否大于 100 *并且小于250:

db.inventory.aggregate(
   [
     {
       $project:
          {
            item: 1,
            qty: 1,
            result: { $and: [ { $gt: [ "$qty", 100 ] }, { $lt: [ "$qty", 250 ] } ] }
          }`在这里插入代码片`
     }
   ]
)
ProjectionOperation projection = Aggregation.project("item", "qty")
                    .and(BooleanOperators.And.and(
                            ComparisonOperators.Gt.valueOf("qty").greaterThanValue(100),
                            ComparisonOperators.Lt.valueOf("qty").lessThanValue(250)
                    )).as("result");

$anyElementTrue

db.survey.aggregate(
   [
     { $project: { responses: 1, isAnyTrue: { $anyElementTrue: [ "$responses" ] }, _id: 0 } }
   ]
)
Aggregation.project("responses")
                    .and(SetOperators.AnyElementTrue.arrayAsSet("responses")).as("isAnyTrue")
                    .andExclude(Fields.UNDERSCORE_ID);

$arrayElemAt

db.users.aggregate([
   {
     $project:
      {
         name: 1,
         first: { $arrayElemAt: [ "$favorites", 0 ] },
         last: { $arrayElemAt: [ "$favorites", -1 ] }
      }
   }
])
Aggregation.project("name")
                    .and(ArrayOperators.ArrayElemAt.arrayOf("favorites").elementAt(0)).as("first")
                    .and(ArrayOperators.ArrayElemAt.arrayOf("favorites").elementAt(-1)).as("last");

$arrayToObject

db.inventory.aggregate(
   [
      {
         $project: {
            item: 1,
            dimensions: { $arrayToObject: "$dimensions" }
         }
      }
   ]
)
Aggregation.project("item")
                    .and(ArrayOperators.ArrayToObject.arrayValueOfToObject("dimensions")).as("dimensions");
db.inventory.aggregate( [
   { $addFields: { instock: { $objectToArray: "$instock" } } },
   { $addFields: { instock: { $concatArrays: [ "$instock", [ { "k": "total", "v": { $sum: "$instock.v" } } ] ] } } } ,
   { $addFields: { instock: { $arrayToObject: "$instock" } } }
] )
又不会写啦哈哈哈哈

未完待续…

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fool_dawei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值