sql >> Database >  >> NoSQL >> MongoDB

mongodb $where-query om de inhoud van het subdocument op te halen

De $where gebruiken operator moet in de meeste gevallen worden vermeden, omdat beide een volledige collectiescan zullen oproepen, ongeacht welke andere omstandigheden een indexselectie zouden kunnen gebruiken.

Bovendien roept u de JavaScript-interpreter op over elk resultaatdocument, dat aanzienlijk langzamer zal zijn dan de native code. Lees de waarschuwingen op de handleiding, ze zijn er met een reden

Probeer waar mogelijk .aggregate() voor dit soort vergelijking. In jouw geval is het zeker de betere optie:

db.foo.aggregate([
    { "$match": { "flag": true } },
    { "$unwind": "$versions" },
    { "$project": {
        "versions": "$versions"
        "same": { "$eq": [ "$versions.version", "$defaultVersion" ] }
    }}
    { "$match": { "same": true } },
    { "$project": {
        "_id": 0,
        "versions": 1
    }}
])

Hierdoor kunt u uw zoekopdracht eerst filteren op de voorwaarde "vlaggen" en vervolgens elk lid van de array inspecteren om te vergelijken of de twee velden hetzelfde zijn.

Indien nodig kunt u vervolgens de overeenkomende array-elementen terugdraaien naar een array waar er meer dan één overeenkomst is. Maar ik denk niet dat dat uw vereiste is.



  1. Maak een MongoDB-gebruiker die alleen de documenten kan beheren die hij heeft gemaakt

  2. Mongomapper-documentatie?

  3. Beheer Python Multiprocessing met MongoDB

  4. Krijg alle sleutels in de Redis-database met python