sql >> Database teknologi >  >> NoSQL >> MongoDB

Find dokumenter med arrays, der indeholder et dokument med et bestemt felt

Brug af $where operatør.

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

En anden måde at gøre dette på er at køre to forespørgsler:En for at hente _id af alle de dokumenter, der ikke matcher dine kriterier ved hjælp af distinct() metode:

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

Brug derefter $nin operatør for at returnere alle de dokumenter, der matcher dine kriterier.

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

Du kan også bruge .aggregate() metode, men dette virker kun, hvis du er på version 3.2 eller nyere, fordi du skal bruge $filter

Første fase i pipelinen er $match trin, hvor du frafiltrerer de dokumenter, hvor "foo"-feltet er fraværende. Dette reducerer det samlede antal dokumenter, der vil blive behandlet. Næste og sidste trin er $redact scene. I dette trin skal du bruge $size operatør for at returnere størrelsen af ​​feltet "dokumenter" og størrelsen af ​​rækken af ​​underdokumenter, hvor "foo" er til stede og returnere alle de dokumenter, hvor de to værdier er ens.

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



  1. BadYieldError ved brug af find()-motor [MongoDB + Tornado]

  2. Find forskellen mellem 2 dokumenter på mongoDB fra mongo-skallen

  3. Kunne ikke vise punkterne inden for et specifikt interval (cirkel) ved hjælp af .getBounds()-funktionen (Leaflet)

  4. Laravel + predis + Redis klynge - FLYTTET / ingen forbindelse til 127.0.0.1:6379