2017-05-04 7 views
0

ich benutzt hatte, die Funktion in meiner lokalen gehosteten Entwicklung zu reduzieren, aber jetzt habe ich den Code zu einem Live-Server bereitgestellt habe und im jetzt einen Fehler bekommen:

MongoError: exception: invalid operator '$reduce' 

Im es mit tägliche Ernährungstagebücher zu bekommen, um Kalorien zu berechnen verbraucht:

user_food.aggregate({$match:{user_id:mongoose.Types.ObjectId(req.session.user_id)}},{$project: {date:1,calories:{$add:[ 
         {$reduce: {input: "$breakfast",initialValue: 0,in: { $add : ["$$value", "$$this.calories"]}}}, 
         {$reduce: {input: "$lunch",initialValue: 0,in: { $add : ["$$value", "$$this.calories"]}}}, 
         {$reduce: {input: "$snacks",initialValue: 0,in: { $add : ["$$value", "$$this.calories"]}}}, 
         {$reduce: {input: "$dinner",initialValue: 0,in: { $add : ["$$value", "$$this.calories"]}}}]}}}, function (err, results) { 
     //if there is an error 
     if (err) { 
      console.log("something went wrong: " + err); 
      return res.status(500).send(err); 
     } else { 
      return res.status(200).send(results); 
     } 
    }); 

Das Dokument für den Benutzer Essen ist ziemlich einfach:

{ 
"_id": ObjectId("58d26c3dd60bd36f40fa0498"), 
"user_id": ObjectId("587cd30bd338b90a6c18e58f"), 
"calories": 2000, 
"date": 20170222, 
"snacks": [ 
    { 
    "nutrients": { 
    "protein": 7.5, 
    "carbs": 56.5, 
    "fat": 10.5 
    }, 
    "servings": 23.8, 
    "calories": 526, 
    "name": "Dairy milk" 
} 
], 
"dinner": [ ], 
"lunch": [ 
{ 
    "nutrients": { 
    "protein": 9.5, 
    "carbs": 25.4, 
    "fat": 17.2 
    }, 
    "servings": 60, 
    "calories": 751, 
    "name": "2 pork sausages rolls" 
} 
], 
"breakfast": [ 
{ 
    "nutrients": { 
    "protein": "4.8", 
    "carbs": "65", 
    "fat": "26" 
    }, 
    "servings": 20.5, 
    "calories": 438, 
    "name": "Oreo" 
} 
], 
"__v": 0 
} 

Wenn mir jemand in die richtige Richtung zeigen kann, um diese ID zu beheben, sei sehr dankbar.

+0

$ reduzieren, ist neu in Version 3.4. Können Sie Ihre db-Version überprüfen, indem Sie db.version() in Ihrer mongo-Shell ausführen? –

+0

@Blastfreak seine Version 2.6.12, gibt es eine Möglichkeit, dies zu beheben, um auf der älteren Version zu arbeiten? –

+0

Grundsätzlich ist es in 3.4 eingeführt, so ist die beste und stabilste Problemumgehung zu aktualisieren. –

Antwort

1

Sie können die folgende Aggregation in der Mongo-Version 2.6 versuchen.

Die $project mit $size alle leeren Felder mit { calories: 0 } von $unwind für alle Embedded-Arrays und $ Gruppe auf $ date gefolgt zu ersetzen und alle Kalorien $ hinzufügen.

user_food.aggregate(
{$project: 
    { 
     date:1, 
     breakfast :{ $cond: [{$eq: [{$size: "$breakfast"}, 0] }, [ { calories: 0 } ], "$breakfast"] }, 
     lunch :{ $cond: [{$eq: [{$size: "$lunch"}, 0] }, [ { calories: 0 } ], "$lunch"] }, 
     snacks :{ $cond: [{$eq: [{$size: "$snacks"}, 0] }, [ { calories: 0 } ], "$snacks"] }, 
     dinner :{ $cond: [{$eq: [{$size: "$dinner"}, 0] }, [ { calories: 0 } ], "$dinner"] } 
    } 
}, 
{$unwind:"$breakfast"}, 
{$unwind:"$lunch"}, 
{$unwind:"$snacks"}, 
{$unwind:"$dinner"}, 
{$group:{_id:"$date", calories:{$sum:{ $add: [ "$breakfast.calories", "$lunch.calories","$snacks.calories", "$dinner.calories"] }} 
}} 
) 

Für weitere Informationen über $project Teil $unwind empty array

Verwandte Themen