MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Finden Sie Dokumente mit Arrays, die ein Dokument mit einem bestimmten Feld enthalten

Verwenden von $where Betreiber.

db.collection.find(function() { 
    return this.docs.length === this.docs.filter(function(doc) {
        return typeof(doc.foo) !== "undefined" && doc.foo !== null ;}).length 
})

Eine andere Möglichkeit besteht darin, zwei Abfragen auszuführen:Eine zum Abrufen der _id aller Dokumente, die Ihren Kriterien nicht entsprechen, mit dem distinct() Methode:

var unwantedIds = db.collection.distinct( "_id", { "docs": { "$elemMatch": { "foo": { "$exists": false } } } } );

Verwenden Sie dann den $nin Operator, um alle Dokumente zurückzugeben, die Ihren Kriterien entsprechen.

db.collection.find({ "_id": { "$nin": unwantedIds } } )

Sie können auch den .aggregate() -Methode, aber dies funktioniert nur, wenn Sie Version 3.2 oder neuer verwenden, da Sie den $filter

Die erste Stufe in der Pipeline ist der $match Phase, in der Sie die Dokumente herausfiltern, in denen das Feld "foo" fehlt. Dadurch wird die Gesamtzahl der Dokumente reduziert, die im weiteren Verlauf verarbeitet werden. Die nächste und letzte Stufe ist der $redact Bühne. In dieser Phase müssen Sie den $size verwenden -Operator, um die Größe des Felds „docs“ und die Größe des Arrays der untergeordneten Dokumente zurückzugeben, in denen „foo“ vorhanden ist, und alle Dokumente zurückzugeben, bei denen die beiden Werte gleich sind.

db.collection.aggregate([
    { "$match": { "docs.foo": { "$exists": true } } }, 
    { "$redact": { 
        "$cond": [ 
            { "$eq": [ 
                { "$size": "$docs" }, 
                { "$size":  { 
                    "$filter": { 
                        "input": "$docs", 
                        "as": "doc", 
                        "cond": { 
                            "$ne": [ 
                                { "$ifNull": [ "$$doc.foo", null ] },
                                null 
                            ] 
                        } 
                    }
                }}
            ]}, 
            "$$KEEP", 
            "$$PRUNE"
        ]
    }}
])