mongodb $ addToSet $ each和duplication

时间:2017-01-15 12:21:30

标签: mongodb

我有一个具有以下格式的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 个答案:

答案 0 :(得分:0)

在您的情况下,您使用$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 
 });

您也可以从here

查看