sql >> Database >  >> NoSQL >> MongoDB

Mongodb vinden in sub-array

Je bent op de goede weg, maar er zijn een paar dingen om op te merken, afgezien van het gedeelte dat geneste arrays (en vooral met anonieme sleutels) niet bepaald een geweldige manier zijn om dingen op te slaan, maar zolang je de positie consequent weet dat zou redelijk goed moeten zijn.

Er is een duidelijk verschil tussen overeenkomende documenten en overeenkomende "elementen van een array" . Hoewel uw huidige waarde niet zou overeenkomen (uw zoekwaarde valt niet binnen de grenzen van het document), als de waarde wel geldig was, komt uw zoekopdracht correct overeen met het "document" hier, die een overeenkomend element in de array bevat.

Het "document" bevat alle van de array-elementen, zelfs degene die niet overeenkomen, maar de voorwaarde zegt het "document" komt overeen, dus het wordt geretourneerd. Als je alleen de bijpassende "elementen" wilt hebben gebruik dan .aggregate() in plaats daarvan:

    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" }
        }}

    ])

En dat geeft alleen de elementen terug die aan de voorwaarde voldeden:

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

Of natuurlijk als je er maar ooit één had verwacht element aan te passen, dan kunt u eenvoudig projectie gebruiken met .find() **:

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

Maar met een term als $gt u krijgt waarschijnlijk meerdere hits binnen een document, dus de geaggregeerde benadering zal veiliger zijn, aangezien de positionele $ operator gaat alleen de eerste . teruggeven wedstrijd.




  1. Golang + MongoDB ingebed type (een struct insluiten in een andere struct)

  2. Bespotten van database in node.js?

  3. Wat is het voordeel van het gebruik van een ObjectId in plaats van een gewone String?

  4. Kunnen we meedoen aan Redis?