sql >> Databasteknik >  >> NoSQL >> MongoDB

mongodb $där fråga för att hämta underdokumentinnehåll

Använda $where Operatören bör undvikas i de flesta fall eftersom den både kommer att anropa en fullständig insamlingsskanning oavsett vilka andra förhållanden som skulle kunna använda ett indexval.

Dessutom anropar du JavaScript-tolken över varje resultatdokument, vilket kommer att vara betydligt långsammare än ursprunglig kod. Läs varningarna på manualsidan, de finns där av en anledning

Om möjligt, försök att använda .aggregate() för denna typ av jämförelse istället. I ditt fall är det definitivt det bättre alternativet:

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

Detta gör att du först kan filtrera din fråga efter "flagga"-villkoret och sedan inspektera varje medlem i arrayen för att jämföra om de två fälten är samma.

Om det behövs kan du sedan rulla tillbaka de matchade arrayelementen till en array där det finns mer än en matchning. Men jag tror inte att det är ditt krav.



  1. Hur man skalar SignalR med Azure Worker Role och OWIN

  2. Uppdatering av kapslade arrayer i mongoDB via mongo-skal

  3. Lagra bilder i en MongoDB-databas

  4. Så här gör du:Använd HBase Thrift Interface, del 1