MongoDB-$unwind操作符-展开

本文详细介绍了MongoDB中的$unwind操作符,解释了如何使用它来拆分数组字段,以便对数组元素进行进一步的聚合操作。通过实例展示了如何统计用户奖励总额,适用于需要对数组对象进行统计的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MongoDB之$unwind操作符【转】

源地址:https://zackku.com/mongodb-unwind/

db.getCollection("Hangers").aggregate([

        {$match : {"StyleNo": "11111111"} },
        {$project : {"HangerID":1, "StyleNo":1} },
        {$lookup : {
                from:"Table1",
                localField: "HangerID",
                foreignField: "HangerID",
                as : "Position"
        } },
        {$project : {"HangerID":1, "StyleNo":1, "StaitonNumOne":{ $slice: ["$Position.StationNum", 1] } }},
        {$unwind: "$StaitonNumOne" }
])

在aggregate中,常常会遇到一些字段属性是数组对象,然后又需要对这些数组对象进行统计。
这时候就需要用到$unwind操作符。这是一个常用的,又容易被忽略的一个操作。

定义

  • field 版

    { $unwind: <field path> }
    
  • document版

    {
      $unwind:
        {
          path: <field path>,
          includeArrayIndex: <string>,
          preserveNullAndEmptyArrays: <boolean>
        }
    }
    
  1. \ 你要打散的字段
  2. includeArrayIndex,分配一个存该数组索引的字段
  3. preserveNullAndEmptyArrays,是否输出空内容。

场景

一个用户表user,其中一个字段是一个数组对象,存的是用户的奖励信息。
这时需要统计用户A所有奖励类型为b的总额。

{
    user_id:A_id ,
    bonus:[
        { type:a ,amount:1000 },
        { type:b ,amount:2000 },
        { type:b ,amount:3000 }
    ]
}

unwind操作:

db.user.aggregate([
    {$unwind:bonus}
])

//结果
{user_id : A_id , bonus:{type : a ,amount : 1000}}
{user_id : A_id , bonus:{type : b ,amount : 2000}}
{user_id : A_id , bonus:{type : b ,amount : 3000}}

统计:

db.user.aggregate([
    {$match: {user_id : A_id} },
    {$unwind:bonus},
    {$match: {'bonus.type' : b} },
    {$group: {_id : '$user_id' , amount : {$sum : {'$bonus.amount'}} }}
])

//结果
{_id:A_id , amount : 5000}

参考 :

https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/ $unwind MongoDB

分类: MongoDB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值