sql >> Database >  >> NoSQL >> MongoDB

MongoDB:een gemiddelde bijwerken in een document met 2 geneste arrays

U kunt geen aggregation gebruiken om een ​​document bij te werken, maar u kunt het zeker gebruiken om de gegevens op te halen die u voor een update wilt gebruiken. Allereerst merkte ik dat er enkele {} . zijn ontbreekt rond je grade object binnen de grades reeks. Misschien wilt u nogmaals controleren of uw documentstructuur is zoals gepost. Ten tweede zijn er een aantal problemen met uw aggregatiequery.

  1. De $avg operator werkt binnen een $group clausule, geen $project .
  2. Als je $avg . gebruikt , u hoeft $sum niet te gebruiken .
  3. U wilt het gemiddelde van trucks.grades.grade.grade_number , die feitelijk de numerieke waarde van het cijfer bevat. Dat wil zeggen, je mist grade tussen grades en grade_number .

Als u deze problemen oplost, krijgt u een vraag die lijkt op het volgende:

db.col.aggregate([ 
    { "$unwind": "$trucks" }, 
    { "$unwind": "$trucks.grades" }, 
    { "$group":
        { 
            "_id": "$trucks.truck_id", 
            "average_grade": { "$avg": "$trucks.grades.grade_number" } 
        } 
    }
]);

Voor uw voorbeelddocument geeft dat het volgende terug:

{ "_id" : "TEB5572", "average_grade" : 4 }
{ "_id" : "TEB7622", "average_grade" : 4 }

Nu kunt u deze informatie gebruiken om de average_grade . bij te werken veld. Als u MongoDB versie 2.6 of hoger gebruikt, is de aggregate methode zal een cursor teruggeven. U kunt door die cursor bladeren en de documenten dienovereenkomstig bijwerken.

In dit voorbeeld zoek ik naar documenten met een bepaalde truck_id in hun trucks array en ga verder met het bijwerken van de average_grade met degene die is berekend door de aggregatiequery. U kunt het aanpassen aan uw behoeften. In combinatie met de aggregatiequery ziet de code er als volgt uit.

// Get average grade for each truck and assign results to cursor.
var cur = db.col.aggregate([ 
    { "$unwind": "$trucks" }, 
    { "$unwind": "$trucks.grades" }, 
    { "$group":
        { 
            "_id": "$trucks.truck_id", 
            "average_grade": { "$avg": "$trucks.grades.grade_number" } 
        } 
    }
]);

// Iterate through results and update average grade for each truck.
while (cur.hasNext()) {
    var doc = cur.next();
    db.col.update({ "trucks.truck_id": doc._id },
                  { "$set": { "trucks.$.average_grade": doc.average_grade }},
                  { "multi": true});
}



  1. MongoDB PHP UTF-8 problemen

  2. MongoDB 2.1 Aggregate Framework Som van array-elementen die overeenkomen met een naam

  3. Vind lege documenten in een database

  4. Hoe zorg je ervoor dat Redis op Heroku begint?