我只想了解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缺乏我认为的网上的例子。
答案 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 返回或保留当前所有字段 文档/嵌入式文档级别,无需进一步检查 此级别的字段。即使包含的字段包含 具有不同访问级别的嵌入式文档。