Сравните два поля массива в одном документе - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть два разных массива с данными, и мне нужно объединить два массива одного объекта в один объект, как я могу объединить с помощью MongoDB Aggregation.вот мои два массива

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

в верхних двух массивах показаны данные. Я хочу объединить только тот объект, актив и уровень которого одинаковы

Expected Result:[{
                 "level" : 2,
                 "asset" : ObjectId("5ba8caa1aa98853296702989"),
                 "total" : 1,
                 "completed" : 5,
                 },{
                 "level" : 2,
                 "asset" : ObjectId("5ba8caf6aa9885329670298a"),
                 "total" : 1,
                 "completed" : 3,
                }]

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Вы можете попробовать ниже агрегации

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
      }
    ]
  }
]
0 голосов
/ 29 сентября 2018

если у вас уже есть два объекта, вы можете сделать это следующим образом.но если вам нужно получить его из mongoDb, вы должны использовать $ mergeObject для агрегации монго.

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)
...