sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur summerar man alla fält i ett underdokument till MongoDB?

Du har gjort det klassiska misstaget att ha godtyckliga fältnamn. MongoDB är "schemafritt", men det betyder inte att du inte behöver tänka på ditt schema. Nyckelnamn ska vara beskrivande, och i ditt fall, t.ex. "S2" betyder egentligen ingenting. För att kunna göra de flesta typer av frågor och operationer måste du designa om ditt schema för att lagra dina data så här:

_id:...
Segment:[
    { field: "S1", value: 1 },
    { field: "S2", value: 5 },
    { field: "Sn", value: 10 },
]

Du kan sedan köra din fråga som:

db.collection.aggregate( [
    { $unwind: "$Segment" },
    { $group: {
        _id: '$_id', 
        sum: { $sum: '$Segment.value' } 
    } } 
] );

Vilket sedan resulterar i något sånt här (med det enda dokumentet från din fråga):

{
    "result" : [
        {
            "_id" : ObjectId("51e4772e13573be11ac2ca6f"),
            "sum" : 16
        }
    ],
    "ok" : 1
}


  1. Få $elemMatch (projektion) att returnera alla objekt som matchar kriterierna

  2. Hur snabbar man upp MongoDB-inlägg/sek?

  3. Hur frågar man MongoDB direkt från Ruby istället för att använda Mongoid?

  4. Hur man säkerhetskopierar och återställer ClusterControl