Как объединить две коллекции в MongoDB с помощью Map / Reduce - PullRequest
0 голосов
/ 13 октября 2018

Я хотел бы объединить эти две коллекции, и у него есть переменная "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()
...