sql >> Database >  >> NoSQL >> MongoDB

MongoDB-query met voorwaardelijke groep op instructie

Uw code werkt niet, omdat $cond is geen accumulatoroperator. Alleen deze accumulator-operators, kunnen worden gebruikt in een $group fase.

Ervan uitgaande dat uw records niet meer dan twee mogelijke waarden van source . bevatten zoals u in uw vraag vermeldt, kunt u een voorwaardelijk $project . toevoegen stage en wijzig de $group podium als,

Code:

    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"
                    ]
                }
            }
        }
    ])

Als er meer dan twee mogelijke waarden voor de bron kunnen zijn, kunt u het volgende doen:

  • Group door de id , firstName , lastName en code . Verzamel de unieke waarden van source , met behulp van de $addToSet operator.
  • Gebruik $redact om alleen de andere waarden te behouden dan email .
  • Project de verplichte velden, als de source array is leeg (alle elementen zijn verwijderd), voeg een waarde toe email ernaartoe.
  • Unwind het bronveld om het als een veld weer te geven en niet als een array. (optioneel)

Code:

    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. Fout:queryTxt ETIMEOUT bij verbinding met MongoDb Atlas met behulp van mangoest

  2. MongoDB $ milliseconde

  3. Mongodb concat int en string

  4. Socket.io-gebruikers tellen op horizontale servers