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

Jak filtrować tablicę poddokumentów?

Począwszy od MongoDB 3.2, możemy użyć $filter operatora, aby skutecznie do tego. W $filtrze wyrażenie warunkowe , musimy użyć $setIsSubset operator, aby sprawdzić, czy dana wartość znajduje się w tablicy. Dzieje się tak głównie dlatego, że nie możemy użyć $in operator zapytania w $project scena.

db.collection.aggregate([
    { "$project": { 
        "list": { 
            "$filter": { 
                "input": "$list", 
                "as": "lst", 
                "cond": { "$setIsSubset": [ [ "$$lst.a" ], [ 1, 5 ] ] }
            } 
        } 
    }}
])

Począwszy od MongoDB 3.0.x wstecz, potrzebujesz innego, mniej wydajnego podejścia przy użyciu $mapa operator i $setDifference operator.

db.collection.aggregate([
    { "$project": { 
        "list": { 
            "$setDifference": [ 
                { "$map": { 
                    "input": "$list", 
                    "as": "lst", 
                    "in": { 
                        "$cond": [
                            { "$setIsSubset": [ [ "$$lst.a" ], [ 1, 5 ] ] },
                            "$$lst",
                            false
                        ] 
                    } 
                }}, 
                [false] 
            ]
        }
    }}
])


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bitwa o bazy danych NoSQL — porównanie MongoDB i CouchDB

  2. Dokument podrzędny zagregowany/projektu jako dokument najwyższego poziomu w mongo

  3. PyMongo $inc ma problemy

  4. MongoDB:Chcę przechowywać obiekt tablicy w kolekcji

  5. Wyszukiwanie MongoDB według typu DateTime nie działa