MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Zapytanie MongoDB z warunkowym grupowaniem według instrukcji

Twój kod nie działa, ponieważ $cond nie jest operatorem akumulatora. Tylko te operatory akumulatorów, mogą być używane w $group etap.

Zakładając, że twoje rekordy zawierają nie więcej niż dwie możliwe wartości source jak wspomniałeś w swoim pytaniu, możesz dodać warunkowy $project etap i zmodyfikuj $group etap jako,

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

Jeśli dla źródła może być więcej niż dwie możliwe wartości, możesz wykonać następujące czynności:

  • Group przez id , firstName , lastName i code . Zbierz unikalne wartości source , używając $addToSet operator.
  • Użyj $redact aby zachować tylko wartości inne niż email .
  • Project wymagane pola, jeśli source tablica jest pusta (wszystkie elementy zostały usunięte), dodaj wartość email do niego.
  • Unwind pole źródłowe, aby wyświetlić je jako pole, a nie tablicę. (opcjonalnie)

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:Sharding na jednej maszynie. Czy ma sens?

  2. Agregat Mongodb (liczba) na wielu polach jednocześnie

  3. MongoDB na Ubuntu nie uruchamia się jako usługa, nic w dzienniku

  4. Zwróć ostatnią prawdziwą wartość dla każdej grupy

  5. MongoDB — Zapytanie o kolekcję