mongodb $addToSet $каждый и дублирование

У меня есть документ MongoDb со следующим форматом

{
  "_id": { "$oid": "587b5a985390100541f52d8e" },
  "name": "M&G",
  "type": "F",
  "category": "Multi",
  "data": [
      {
        "date": { "$date": "2014-08-03T22:00:00.000Z" },
        "value": 13.172
      },
      {
        "date": { "$date": "2014-08-04T22:00:00.000Z" },
        "value": 13.133
      }
  ],
  "meta": {
    "code": "103039925"
  }
}

Я использую

 var cname =  // collection name
 var docs= [] // array of objecs e.g. {date:<Date> value:<Number> }
 var opts = { w: 1, upsert: false, returnOriginal: false };

 connection.collection(cname)
 .findOneAndUpdate(query, { $addToSet: {data: { $each: docs }} }, opts, function (err, res) {
  // do something 
 });

моя проблема — $addToSet гарантирует, что в набор не будет добавлен повторяющийся объект
но использовать равенство объектов

этот объект имеет повторяющуюся дату, но не распознается как дубликат $addToSet

{
    "date": { "$date": "2014-08-04T22:00:00.000Z" },
    "value": 0
}

мое приложение требует, чтобы любой объект в массиве имел уникальную дату.
Есть ли способ получить это? фактически, если наблюдается объект с повторяющейся датой, он должен обновить значение объекта

1 ответ

  1. В вашем случае вы используете$addToSet, с $eachкоторым выполнять Arrayв соответствии с моими знаниями, но в вашем случае вы используетеObject array, который является формой встроенного документа в MongoDB.

    Я думаю, что вы можете использовать этот подход или может быть другой подход есть

    {
      "_id": { "$oid": "587b5a985390100541f52d8e" },
      "name": "M&G",
      "type": "F",
      "category": "Multi",
      "data": [
          {
            "date": "2014-08-03T22:00:00.000Z" ,
            "value": 13.172
          },
          {
            "date": "2014-08-04T22:00:00.000Z" ,
            "value": 13.133
          }
      ],
      "meta": {
        "code": "103039925"
      }
    }
    
    
     var cname =  // collection name
     var docs= [] // array of objecs e.g. {date:<Date> value:<Number> }
     var opts = { w: 1, upsert: false, returnOriginal: false };
    
     connection.collection(cname)
     .update({'data.date': { '$ne': new Date() } },{ $push: {data: docs } }, opts, function (err, res) {
      // do something 
     });
    

    вы также можете проверить отсюда