sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB-forespørgsel med betinget gruppe for erklæring

Din kode virker ikke, fordi $cond er ikke en akkumulatoroperatør. Kun disse akkumulatoroperatorer, kan bruges i en $group scene.

Forudsat at dine poster ikke indeholder mere end to mulige værdier af source som du nævner i dit spørgsmål, kan du tilføje et betinget $project iscenesætte og ændre $group scene som,

Kode:

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

Hvis der kan være mere end to mulige værdier for kilden, kan du gøre følgende:

  • Group ved hjælp af id , firstName , lastName og code . Akkumuler de unikke værdier af source , ved hjælp af $addToSet operatør.
  • Brug $redact for kun at beholde andre værdier end email .
  • Project de påkrævede felter, hvis source array er tom (alle elementer er blevet fjernet), tilføj avalue email til det.
  • Unwind kildefeltet for at angive det som et felt og ikke en matrix.(valgfrit)

Kode:

    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. MongoDB samlet selektivt projekt

  2. Hvordan bruger jeg GraphQL med Mongoose og MongoDB uden at oprette Mongoose-modeller

  3. Meteor App miljøvariabler

  4. Tips til fjernstyring af MongoDB