ドキュメントのバッチを集約しようとしています。 $ Pushにしたいドキュメントには2つのフィールドがあります。ただし、「_ id」および「A」フィールドであるとしましょう。「A」が$ gt 0の場合、$ Pushの「_id」および「A」のみが必要です。
2つのアプローチを試しました。
最初の1つ。
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"}
}])
2番目のものは単に機能しません...
他の場合に$ 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"]
}
これは、@ Veeramによって提案された投稿を読んだ後の質問に対する私の答えです。
db.collection.aggregate([{
"$group":{
"field": {
"$Push": {
"$cond":[
{"$gt":["$A", 0]},
{"id": "$_id", "A":"$A"},
null
]
}
},
"secondField":{"$Push":"$B"}
},
{
"$project": {
"A":{"$setDifferrence":["$A", [null]]},
"B":"$B"
}
}])
もう1つのオプションは、$ 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"
}
}])
最初のステップで配列を結合し、2番目のステップでフィルター処理します