MONGODB编辑数组

时间:2018-04-15 15:09:10

标签: mongodb

我只想了解mongodb中的$ redact 假设我有一个类似的集合。

db.tab12.find()

{ "_id" : "1", "name" : "jan", "passport" : [ "usa" ] }
{ "_id" : "2", "name" : "jaan", "passport" : [ "usa", "canada" ] }
{ "_id" : "3", "name" : "jon", "passport" : [ "germany" ] }

我运行以下命令

db.tab12.aggregate({$match:{"name":{$regex:"a"}}},{$redact:{$cond:{if:{$in:["$country",["canada"]]},then:"$$DESCEND",else:"$$PRUNE" }} } )

我没有得到任何结果,mongodb缺乏我认为的网上的例子。

1 个答案:

答案 0 :(得分:0)

让我们假设您有收藏集 PC 事件。 PC正在生成其他类型的事件,而您只想接收来自type:1

的事件
PC {
"_id": ObjectId,
"version": "SomeVersion",
"location": "Sofia",
"price": 220,
 events: [1,2,3,4,5]
}

events{
"_id":1,
"type": 1,
"ts": "1999-01-01"
}

events{
"_id":2,
"securiy:" true,
"type": 2,
"ts": "2015-01-01"
}

PCs.aggregate([
        {
          $match: {
            "location": "Sofia"
          }
        },
        {
          $unwind: {
            path: '$events'
          }
        },
        {
          $project: {
            events: '$pcs.events'
          }
        },
        {
          $unwind: {
            path: '$events'
          }
        },
        {
          $lookup: {
            from: 'events',
            localField: 'event',
            foreignField: '_id',
            as: 'events'
          }
        },
        {
          $match: {
            $and: [{
              'events.ts': {
                $gt: new Date("1970-01-01")
              }
            },
            {
              'events.ts': {
                $lt: new Date("2000-02-02")
              }
            }
            ] 
          }
        },
        {
          $redact: {
            $cond: {
              if: { $eq: [ '$events.type', 1 ] },
              then: '$$KEEP',
              else: '$$PRUNE'
            }
          }
        },

这将删除所有其他未通过条件的事件。完成此步骤后,您可以进行某种分组,例如,如果事件具有某些数据(例如价格),则可以对其进行汇总。

{
  $group: {
    _id: {
      isSecurityEvent: '$events.security',
    },
    totalEvents: { $sum: 1 },
    }
  }
}

])

mongo documentation中,您有3种类型的运算符:

  

系统变量说明

     

$$ DESCEND $ redact 返回字段   当前文档级别,不包括嵌入式文档。包括   嵌入式文档和数组中的嵌入式文档,请应用   $ cond表达式对嵌入式文档的访问权限进行确定   这些嵌入式文档。

     

$$ PRUNE $ redact 目前不包括所有字段   文档/嵌入式文档级别,无需进一步检查   排除的字段。即使排除字段包含   具有不同访问级别的嵌入式文档。

     

$$ KEEP $ redact 返回或保留当前所有字段   文档/嵌入式文档级别,无需进一步检查   此级别的字段。即使包含的字段包含   具有不同访问级别的嵌入式文档。