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

Mongodb najít uvnitř dílčí pole

Jste na správné cestě, ale je zde několik věcí, které je třeba si povšimnout, kromě části, že vnořená pole (a zvláště s anonymními klíči) nejsou zrovna skvělým způsobem ukládání věcí, ale pokud důsledně znáte polohu, pak to by mělo být přiměřeně v pořádku.

Mezi odpovídajícími dokumenty je výrazný rozdíl a odpovídající "prvky pole" . I když by se vaše aktuální hodnota ve skutečnosti neshodovala (vaše hledaná hodnota není v mezích dokumentu), pokud byla hodnota skutečně platná, váš dotaz správně odpovídá "dokumentu" zde, který obsahuje odpovídající prvek v poli.

"dokument" obsahuje vše prvků pole, a to i těch, které se neshodují, ale podmínka říká "dokument" odpovídá, takže je vráceno. Pokud chcete pouze odpovídající "prvky" pak použijte .aggregate() místo toho:

    db.infos.aggregate([
        // Still match the document
        { "$match": { 
            "info": { 
                "$elemMatch": { "0": {"$gte": 1399583285000} }
            }
        }},

        // unwind the array for the matched documents
        { "$unwind": "$info" },

        // Match only the elements
        { "$match": { "info.0": { "$gte": 1399583285000 } } },

        // Group back to the original form if you want
        { "$group": {
            "_id": "$_id",
            "info": { "$push": "$info" }
        }}

    ])

A to vrátí pouze prvky, které odpovídaly podmínce:

{
    "_id" : ObjectId("536c1145e99dc11e65ed07ce"),
    "info" : [
            [
                    1399583285000,
                    20.13
            ],
            [
                    1399583286000,
                    20.13
            ]
    ]
}

Nebo samozřejmě, pokud jste kdy očekávali jen jeden prvek, který se má shodovat, pak můžete jednoduše použít projekci pomocí .find() **:

db.infos.find(
    {
       "info":{
          "$elemMatch":{
             "0": {
                "$gt": 1399583285000
             }
          }
       }
    },
    {
        "info.$": 1
    }
)

Ale s výrazem jako $gt pravděpodobně získáte v dokumentu více požadavků, takže agregovaný přístup bude bezpečnější vzhledem k tomu, že poziční $ operátor vrátí pouze první zápas.




  1. 2 způsoby, jak nahradit podřetězec v MongoDB

  2. Operátor dotazu MongoDB $nin

  3. Souběžnost v gopkg.in/mgo.v2 (Mongo, Go)

  4. Redis:Závodní stav a jeden závit