Reputation: 653
I have two different Arrays with Data and I have to merge two arrays same object in one object how can I merge with help of MongoDB Aggregation. here are my two Arrays
{"ids" : [
{
"_id" : ObjectId("5ba8d8dfaa988532967029af"),
"level" : 2,
"completed" : 5,
"asset" : ObjectId("5ba8caa1aa98853296702989")
},
{
"_id" : ObjectId("5ba8d8dfaa988532967029b0"),
"level" : 2,
"completed" : 3,
"asset" : ObjectId("5ba8caf6aa9885329670298a")
},
{
"_id" : ObjectId("5ba8d8dfaa988532967029b1"),
"level" : 2,
"asset" : ObjectId("5ba8cb09aa9885329670298b")
}]}
{"total" : [
{
"total" : 1,
"asset" : ObjectId("5ba8caa1aa98853296702989"),
"level" : 2
},
{
"total" : 1,
"asset" : ObjectId("5ba8caf6aa9885329670298a"),
"level" : 2
},
{
"total" : 1,
"asset" : ObjectId("5ba8cb09aa9885329670298b"),
"level" : 2
}]}
in upper two arrays data are shown I want to merge only that object whose asset and level are same
Expected Result:[{
"level" : 2,
"asset" : ObjectId("5ba8caa1aa98853296702989"),
"total" : 1,
"completed" : 5,
},{
"level" : 2,
"asset" : ObjectId("5ba8caf6aa9885329670298a"),
"total" : 1,
"completed" : 3,
}]
Upvotes: 0
Views: 1258
Reputation: 46491
You can try below aggregation
db.collection.aggregate([
{ "$project": {
"Result": {
"$map": {
"input": "$total",
"as": "c",
"in": {
"total": "$$c.total",
"level": "$$c.level",
"asset": "$$c.asset",
"completed": {
"$arrayElemAt": [
"$ids.completed",
{ "$indexOfArray": ["$ids.asset", "$$c.asset"] }
]
}
}
}
}
}}
])
[
{
"Result": [
{
"asset": ObjectId("5ba8caa1aa98853296702989"),
"completed": 5,
"level": 2,
"total": 1
},
{
"asset": ObjectId("5ba8caf6aa9885329670298a"),
"completed": 3,
"level": 2,
"total": 1
},
{
"asset": ObjectId("5ba8cb09aa9885329670298b"),
"level": 2,
"total": 1
}
]
}
]
Upvotes: 1
Reputation: 703
if you already have two objects then you can do like this. but if you need to get it from mongoDb then you should use $mergeObject in mongo aggregation.
var a = [
{
"_id" : "5ba8d8dfaa988532967029af",
"level" : 2,
"completed" : 5,
"asset" : "5ba8caa1aa98853296702989"
},
{
"_id" : "5ba8d8dfaa988532967029b0",
"level" : 2,
"completed" : 3,
"asset" : "5ba8caf6aa9885329670298a"
}];
var b = [
{
"total" : 1,
"asset" : "5ba8caa1aa98853296702989",
"level" : 2
},
{
"total" : 1,
"asset" : "5ba8caf6aa9885329670298a",
"level" : 2
}];
var output = [];
function extend(obj, src) {
src.forEach(function(key,index) {
if(obj[index]["asset"] == src[index]["asset"] && obj[index]["level"] == src[index]["level"]){
let c = {...obj[index],...src[index]};
output.push(c);
}
});
}
extend(a, b);
console.log(output)
Upvotes: 2