sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man returnerar dokument där två fält har samma värde

Du har två alternativ här. Den första är att använda $where operatör.

Collection.find( { $where: "this.start === this.end" } )

Det andra alternativet är att använda aggregeringsramverket och $redact operatör.

Collection.aggregate([
    { "$redact": { 
        "$cond": [
            { "$eq": [ "$start", "$end" ] },
            "$$KEEP",
            "$$PRUNE"
        ]
    }}
])

$where operatorn gör en JavaScript-utvärdering och kan inte dra nytta av index så fråga med $where kan orsaka sämre prestanda i din applikation. Se överväganden . Om du använder $where kommer vart och ett av dina dokument att konverteras från BSON till JavaScript-objekt före $where-operationen, vilket kommer att orsaka sämre prestanda. Naturligtvis kan din fråga förbättras om du har ett indexfilter. Det finns också en säkerhetsrisk om du bygger din fråga dynamiskt baserat på användarinmatning.

$redact som $where använder inte index och utför ens en samlingsskanning, men din frågeprestanda förbättras när du $redact eftersom det är en standard MongoDB-operatörer. Som sagt är aggregeringsalternativet mycket bättre eftersom du alltid kan filtrera ditt dokument med $match-operatorn.

$where här är bra men kan undvikas. Jag tror också att du bara behöver $where när du har ett schemadesignproblem. Att till exempel lägga till ytterligare ett booleskt fält till dokumentet med index kan vara ett bra alternativ här.



  1. Batchuppdatering med Mongoose

  2. I Mongo något sätt att göra kontroll och inställning som atomär drift?

  3. Det går inte att beräkna genomsnittlig tid

  4. MongoDB-fel:Kan inte använda omprövningsbara skrivningar med limit=0