sql >> Database >  >> NoSQL >> MongoDB

Documenten zoeken met arrays die een document met een bepaald veld bevatten

De $where gebruiken telefoniste.

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

Een andere manier om dit te doen is door twee zoekopdrachten uit te voeren:Een om de _id . op te halen van al die documenten die niet voldoen aan uw criteria met behulp van de distinct() methode:

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

Gebruik dan de $nin operator om al die documenten terug te sturen die aan uw criteria voldoen.

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

U kunt ook de .aggregate() methode, maar dit werkt alleen als u versie 3.2 of nieuwer gebruikt, omdat u de $filter

De eerste fase in de pijplijn is de $match fase waarin u die documenten uitfiltert waar het veld "foo" ontbreekt. Dit vermindert het totale aantal documenten dat door de pijp zal worden verwerkt. De volgende en laatste fase is de $redact fase. In deze fase moet je de $size . gebruiken operator om de grootte van het veld "docs" en de grootte van de array van de subdocumenten waarin "foo" aanwezig is te retourneren en al die documenten terug te geven waarvan de twee waarden gelijk zijn.

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. pipelining vs transactie in redis

  2. Waarde retourneren van asynchrone functie node.js

  3. Ontbrekend veld in Mongo/Mongoose-queryresultaten

  4. Mongodb kan niet starten in Ubuntu 15.04