Я хотел бы объединить эти две коллекции, и у него есть переменная "name" в качестве общего поля.
// product collections
db.products.insertOne( { name : "iPhone 5", Price : 600, company : "Apple"})
db.products.insertOne( { name : "Galaxy Note9", Price : 900, company : "samsung"})
db.products.insertOne( { name : "LG V40 ThinQ", Price : 800, company : "LG"})
db.products.insertOne( { name : "Watch", Price : 400, company : "Apple"})
db.products.insertOne( { name : "iPhone 7", Price : 900, company : "Apple"})
// product_review Collection
db.product_review.insertOne( { name : "Watch", comment: " Great Product" })
db.product_review.insertOne( { name : "Watch", comment: " AMAZING" })
db.product_review.insertOne( { name : "iPhone 7", comment: " Not bad" })
db.product_review.insertOne( { name : "iPhone 7", comment: " Expeinsive" })
db.product_review.insertOne( { name : "Galaxy Note9", comment: " Great Product" })
db.product_review.insertOne( { name : "Galaxy Note9", comment: " Great Product" })
// end of product_review collection.
Вывод, который я ищу, следующий.Одно имя и один или несколько комментариев без повторения имени с каждым комментарием.Это должно быть так.
{
name: "iPhone 7",
Price: 900,
company: "Samsung",
comments :[
{"comment": "Not bad"},
{"comment": " Expeinsive"}
]
}
Мой текущий код не дает мне комментарий, он дает мне имя и цену, а также пустой комментарий.
Я нашел этот коди попытался принять его, но это может работать, как я хочу
// map for products collection
var mapproducts = function() {
var output = {
name: this.name,
Price :this.Price,
company:this.company,
comment:0
}
if (this.Price == 0) {
output.name = this.name;
}
emit(this.name, output);
};
// map for product_review collection
var map_product_review = function() {
emit(this.name, {
name: this.name,
comment:this.comment,
Price:0,
company: 0
});
};
// Reduce function.
// I believe that the "IF condition" has to be done, is specific ways
var r = function(key, values) {
var outs = { name: 1,comment: 1, Price: 0,company:0};
values.forEach(function(v){
outs.name = v.name;
if (v.comment == 0) {
outs.Price = v.Price;
outs.company = v.company;
}
});
return outs;
};
db.products.mapReduce(mapproducts, r, {out: {reduce: ‘Result’}})
db.product_review.mapReduce(map_product_review, r, {out: {reduce: 'Result'}})
db.Result.find().pretty()