sql >> Databáze >  >> NoSQL >> MongoDB

Mongo dotaz na více polí dílčího dokumentu

To je vlastně to, co $elemMatch operátor je pro i když je často zneužíván. V podstatě provádí podmínky dotazu na každý prvek "uvnitř" pole. Všechny argumenty MongoDB jsou operace „a“, pokud není výslovně uvedeno jinak:

db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2  } } })

Pravděpodobně zde také budete chtít "promítnout", pokud očekáváte pouze odpovídající pole a ne celý dokument:

db.collection.find(
    { "arr": { "$elemMatch": { "name": "b", "num": 2  } } },
    { "arr.$": 1 }
)

Nakonec, abyste vysvětlili, proč váš druhý pokus nefunguje, tento dotaz:

db.collection.find({
    "arr": [
        { "name": "b", "num": 2 }
    ]
})

Neodpovídá ničemu, protože neexistuje žádný skutečný dokument, kde by „arr“ obsahoval singulární prvek přesně odpovídající vašim podmínkám.

Váš první příklad selhal..:

db.collection.find({
    $and: [
        { "arr.name": "b" },
        { "arr.num": 2 }
    ]
});

Protože existuje několik prvků pole, které splňují podmínky, a to není jen považováno za to, že obě podmínky platí pro stejný prvek. To je to, co $elemMatch dodává, a když potřebujete, aby se shodovala více než jedna podmínka, použijte ji zde.




  1. Redis + ActionController::Živá vlákna neumírají

  2. Meteor:Jak napsat publikační funkci obsahující uživatelské jméno

  3. Pole filtrů MongoDb

  4. Potřebujete pokyny k agregovanému vyhledávání mongo, abyste mohli počítat poduzly ve všech podřízených uzlech pro každý uzel