web-dev-qa-db-ja.com

Mongodb-条件付きの場合は集約$ Push

ドキュメントのバッチを集約しようとしています。 $ 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"]
}
12
Artorias

これは、@ 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"
    }
}])
8
Artorias

もう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番目のステップでフィルター処理します

3
Artyom