sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB-fråga med villkorlig grupp för uttalande

Din kod fungerar inte eftersom $cond är inte en ackumulatoroperatör. Endast dessa ackumulatoroperatorer, kan användas i en $group skede.

Förutsatt att dina poster inte innehåller fler än två möjliga värden för source som du nämner i din fråga, kan du lägga till ett villkorligt $project steg och ändra $group steg som,

Kod:

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

Om det kan finnas fler än två möjliga värden för källa, kan du göra följande:

  • Group med id , firstName , lastName och code . Ackumulera de unika värdena för source , med hjälp av $addToSet operatör.
  • Använd $redact för att bara behålla andra värden än email .
  • Project de obligatoriska fälten, om source arrayen är tom (alla element har tagits bort), lägg till avalue email till det.
  • Unwind källfältet för att lista det som ett fält och inte en array.(valfritt)

Kod:

    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. InvalidDocument:Kan inte koda objekt:<Användare:Användarobjekt> ReferenceField med MongoEngine

  2. Ange flera kriterier för matriselement

  3. När du ska använda CouchDB över MongoDB och vice versa

  4. Docker container mongod fel vid start via ssh