sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB dotaz s podmíněnou skupinou podle příkazu

Váš kód nefunguje, protože $cond není provozovatelem akumulátorů. Pouze tyto akumulátorové operátory, lze použít v $group etapa.

Za předpokladu, že vaše záznamy neobsahují více než dvě možné hodnoty source jak uvádíte ve své otázce, můžete přidat podmíněný $project fázi a upravte $group fáze jako,

Kód:

    db.customer.aggregate([
        {
            $group: {
                "_id": {
                    "id": "$id",
                    "firstName": "$firstName",
                    "lastName": "$lastName",
                    "code": "$code"
                },
                "sourceA": { $first: "$source" },
                "sourceB": { $last: "$source" }
            }
        },
        {
            $project: {
                "source": {
                    $cond: [
                        { $eq: ["$sourceA", "email"] },
                        "$sourceB",
                        "$sourceA"
                    ]
                }
            }
        }
    ])

V případě, že může existovat více než dvě možné hodnoty pro zdroj, můžete provést následující:

  • Group podle id , firstName , lastName a code . Shromážděte jedinečné hodnoty source , pomocí $addToSet operátor.
  • Použít $redact zachovat pouze hodnoty jiné než email .
  • Project povinná pole, pokud je source pole je prázdné (všechny prvky byly odstraněny), přidejte hodnotu email k tomu.
  • Unwind zdrojové pole, aby bylo uvedeno jako pole a nikoli pole. (volitelné)

Kód:

    db.customer.aggregate([
        {
            $group: {
                "_id": {
                    "id": "$id",
                    "firstName": "$firstName",
                    "lastName": "$lastName",
                    "code": "$code"
                },
                "sourceArr": { $addToSet: { "source": "$source" } }
            }
        },
        {
            $redact: {
                $cond: [
                    { $eq: [{ $ifNull: ["$source", "other"] }, "email"] },
                    "$$PRUNE",
                    "$$DESCEND"
                ]
            }
        },
        {
            $project: {
                "source": {
                    $map: {
                        "input":
                        {
                            $cond: [
                                { $eq: [{ $size: "$sourceArr" }, 0] },
                                [{ "source": "item" }],
                                "$sourceArr"]
                        },
                        "as": "inp",
                        "in": "$$inp.source"
                    }
                }
            }
        }
    ])



  1. Rady ohledně migrace z MongoMapper na Mongoid?

  2. node.js mongodb vybrat dokument podle _id node-mongodb-native

  3. Export system.profile z MongoDB nefunguje

  4. Mám přistupovat přímo k mongodb?