【问题标题】:mongodb $addToSet $each and duplicationmongodb $addToSet $each 和重复
【发布时间】:2017-05-30 09:13:45
【问题描述】:

我有一个格式如下的 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
}

我的应用程序要求数组中的任何对象都有唯一的日期。 有没有办法获得它?实际上,如果观察到具有重复日期的对象,它应该更新对象的值

【问题讨论】:

    标签: mongodb


    【解决方案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 
     });
    

    您也可以通过here查看

    【讨论】:

    • 我认为你的建议不会奏效... { $push: {data: docs } } 我认为应该是 { $push: { data: { $each: docs } } }但我无法获得 {'data.date': { '$ne': new Date() } } 部分。我的目标是仅当新对象没有具有相同日期的对象时才将其附加到数据数组中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2015-02-10
    • 2020-08-16
    • 2015-12-10
    • 1970-01-01
    • 2017-01-31
    • 2013-08-26
    相关资源
    最近更新 更多