Mongodb - 聚合 $push 如果有条件
Posted
技术标签:
【中文标题】Mongodb - 聚合 $push 如果有条件【英文标题】:Mongodb - aggregation $push if conditional 【发布时间】:2018-09-16 03:23:30 【问题描述】:我正在尝试聚合一批文档。我想 $push 的文档中有两个字段。但是,假设它们是“_id”和“A”字段,如果“A”为 $gt 0,我只想要 $push “_id”和“A”。
我尝试了两种方法。
第一个。
db.collection.aggregate([
"$group":
"field":
"$push":
"$cond":[
"$gt":["$A", 0],
"id": "$_id", "A":"$A",
null
]
,
"secondField":"$push":"$B"
])
但这会将空值推送到“字段”,我不想要它。
第二个。
db.collection.aggregate([
"$group":
"field":
"$cond":[
"$gt",["$A", 0],
"$push": "id":"$_id", "A":"$A",
null
]
,
"secondField":"$push":"$B"
])
第二个根本行不通...
有没有办法在其他情况下跳过 $push ?
添加:
预期文件:
"_id":objectid(1),
"A":2,
"B":"One"
,
"_id":objectid(2),
"A":3,
"B":"Two"
,
"_id":objectid(3),
"B":"Three"
预期输出:
"field":[
"A":"2",
"_id":objectid(1)
,
"A":"3",
"_id":objectid(2)
,
],
"secondField":["One", "Two", "Three"]
【问题讨论】:
我认为你的方法行不通docs.mongodb.com/manual/reference/operator/aggregation/push > $push 仅在 $group 阶段可用。 @libik 我更正了我的问题。 【参考方案1】:你可以使用"$$REMOVE"
:
db.collection.aggregate([
$group:
field:
$push:
$cond:[
$gt: ["$A", 0] ,
id: "$_id", A:"$A" ,
"$$REMOVE"
]
,
secondField: $push: "$B"
])
这样你就不必过滤空值了。
【讨论】:
$$REMOVE 是系统变量,不是运算符【参考方案2】:这是我在阅读@Veeram 建议的帖子后对问题的回答
db.collection.aggregate([
"$group":
"field":
"$push":
"$cond":[
"$gt":["$A", 0],
"id": "$_id", "A":"$A",
null
]
,
"secondField":"$push":"$B"
,
"$project":
"A":"$setDifference":["$A", [null]],
"B":"$B"
])
【讨论】:
这里的setDifference有错别字。 您好,在谷歌搜索时发现了这个,您如何将setDifference
参数转换为 mgo
库?哪种类型?【参考方案3】:
另一种选择是使用 $filter 运算符:
db.collection.aggregate([
$group :
_id: null,
field: $push: id: "$_id", A : "$A",
secondField: $push: "$B"
,
$project:
field:
$filter:
input: "$field",
as: "item",
cond: $gt: [ "$$item.A", 0 ]
,
secondField: "$secondField"
])
第一步,你合并你的数组并在第二步过滤它们
【讨论】:
以上是关于Mongodb - 聚合 $push 如果有条件的主要内容,如果未能解决你的问题,请参考以下文章
$element 匹配或 $unwind 与 AND/Multiple 条件与 mongoDB 聚合
$match mongodb聚合框架_mongoose中的多条件[重复]