Compare two array fields in same document

时间秒杀一切 提交于 2020-02-23 07:34:21

问题


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,
                }]

回答1:


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)



回答2:


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"] }
            ]
          }
        }
      }
    }
  }}
])

Output

[
  {
    "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
      }
    ]
  }
]


来源:https://stackoverflow.com/questions/52566709/compare-two-array-fields-in-same-document

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!