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

Selektywny projekt agregatu MongoDB

Wydawało się, że jesteś na dobrej drodze, są tylko różne podejścia do usuwania tych wartości false od warunkowego. Nie możesz sprawić, by nic nie zwracało, ale nie możesz pozbyć się wartości, których nie chcesz.

Jeśli naprawdę chcesz "zestawów" i masz dostępne MongoDB 2.6 lub nowsze, to w zasadzie odfiltrowujesz false wartości przy użyciu $setDifference :

db.entities.aggregate([
    { "$unwind": "$entities" },
    { "$group": {
        "_id": "$_id",
        "A": { 
            "$addToSet": {
                "$cond": [
                    { "$eq": [ "$entities.type", "A" ] },
                    "$entities.val",
                    false
                ]
            }
        },
        "B": { 
            "$addToSet": {
                "$cond": [
                    { "$eq": [ "$entities.type", "B" ] },
                    "$entities.val",
                    false
                ]
            }
        }
    }},
    { "$project": {
        "A": {
            "$setDifference": [ "$A", [false] ]
        },
        "B": {
            "$setDifference": [ "$B", [false] ]
        }
    }}
])

Lub po prostu jako jeden krok za pomocą $map operator wewnątrz $project :

db.entities.aggregate([
    {"$project": {
        "A": {
             "$setDifference": [
                 {
                     "$map": {
                         "input": "$entities",
                         "as": "el",
                         "in": {
                             "$cond": [
                                 { "$eq": [ "$$el.type", "A" ] },
                                 "$$el.val",
                                 false
                             ]
                         }
                     }
                 },
                 [false]
             ]
         },
        "B": {
             "$setDifference": [
                 {
                     "$map": {
                         "input": "$entities",
                         "as": "el",
                         "in": {
                             "$cond": [
                                 { "$eq": [ "$$el.type", "B" ] },
                                 "$$el.val",
                                 false
                             ]
                         }
                     }
                 },
                 [false]
             ]
         }
    }}
])

Lub pozostań przy ogólnym $unwind i $match operatorów, aby je filtrować:

db.entities.aggregate([
    { "$unwind": "$entities" },
    { "$group": {
        "_id": "$_id",
        "A": { 
            "$push": {
                "$cond": [
                    { "$eq": [ "$entities.type", "A" ] },
                    "$entities.val",
                    false
                ]
            }
        },
        "B": { 
            "$push": {
                "$cond": [
                    { "$eq": [ "$entities.type", "B" ] },
                    "$entities.val",
                    false
                ]
            }
        }
    }},
    { "$unwind": "$A" },
    { "$match": { "A": { "$ne": false } } },
    { "$group": {
        "_id": "$_id",
        "A": { "$push": "$A" },
        "B": { "$first": "$B" }
    }},
    { "$unwind": "$B" },
    { "$match": { "B": { "$ne": false } } },
    { "$group": {
        "_id": "$_id",
        "A": { "$first": "$A" },
        "B": { "$push": "$B" }
    }}
])

Używając $push dla normalnych tablic lub $addToSet dla unikalnych zestawów.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak wygenerować i pobrać plik pdf z dynamiczną ścieżką obrazu z bazy danych za pomocą dowolnych pakietów npm

  2. mongo znajdź zapytanie na joda datetime

  3. Mongodb:obliczone connectToField wewnątrz graphlookup

  4. MongoDB otrzymuje statystyki wykonania dla zapytania agregującego

  5. Załaduj obraz z pliku binarnego (Javascript - Ajax - MongoDB)