Example document 1
{
"site": "xyz.com",
"Reg_NumReviews": {
"value1": "194",
"value53": "3,570"
},
"Reg_Score": {
"value1": "3.24",
"value53": "1.9"
}
}
desired document after modification
{
"site": "xyz.com",
"Reg_NumReviews": {
"value1": "194",
"value53": "3,570"
},
"Reg_Score": {
"value1": "3.24",
"value53": "1.9"
},
"Total_reviews" : "3764"
"Average_score" : 1.97
}
Example document 2
{
"site": "werw.com",
"Reg_NumReviews": {
"value1": "194",
"value33": "2014",
"value5": "234"
},
"Reg_Score": {
"value1": "2.24",
"value33": "3.9",
"value33": "3",
}
}
desired document after modification
{
"site": "werw.com",
"Reg_NumReviews": {
"value1": "194",
"value33": "2014",
"value5": "234"
},
"Reg_Score": {
"value1": "2.24",
"value33": "3.9",
"value5": "3",
},
"Total_reviews" : "2442"
"Average_score" : "3.68"
}
Code I have tried is a variant of the following.
db.SiteData.update({"site": "xyz.com" },
[ {"$set": { "Total_reviews" :
{"$sum" : {"$regex" : /Reg_NumReviews.\.*/} }}}],
{upsert:true})
If I was to describe it in words:
- find the document with the site matching the necessary pattern.
- check Reg_NumReviews is a key in the object. If yes, start a set operation. Sum the value of all the key-value pairs, assign as Total_reviews.
- moving to the next operation, which is slightly more involved. Find the matching keys in Reg_NumReviews and Reg_Scores and multiply them. Sum all these values and divide by Total_reviews, assign as Average_score.
Edit To clarify step 3 For example in Document two
The effect would be:
Average_score =
(
( Reg_NumReviews.value1 * RegScore.value1 ) +
( Reg_NumReviews.value33 * RegScore.value33 ) +
( Reg_NumReviews.value5 * RegScore.value5 )
) / Total_reviews