如果特定字段不相同,则Upsert-update该行

时间:2016-05-07 11:19:15

标签: mongodb mongodb-query

我是mongo db的新手。我有一个特定的问题,我只有在该文档中的字段不相同时才更新行。以下是示例

让我们考虑以下数据与卖家& ASIN作为独特的领域。

{ "_id" : ObjectId("572dc897bde92c7907ffaf71"), "seller" : "amazon", "ASIN" : "XYZ", "price" : 46, "lastUpdatedate" : ISODate("2016-05-07T10:59:11.165Z") }

现在我有两个任务中的一个。

  1. 仅在卖家和&amp ;; ASIN是独一无二的

  2. 仅当价格不相同时才更新上述ID。示例如果我向同一卖家发送电话& ASIN与价格:47然后它应该突出上面的行,如果价格是46,那么它不应该做任何改变。 理想情况下,如果价格保持不变,字段lastUpdatedate应保持相同。

  3. 在此之后,我将仅查询lastupdatedate已更改的行<昨天将数据上传到其他模块。这将大大减少上传到其他模块的数据。

    请帮忙。

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

第一期

MongoDB的update命令有一个可选的upsert参数......

  

...如果设置为true,则在没有文档与查询条件匹配时创建新文档。

你可以这样使用它:

db.yourCollection.update({ seller: 'amazon', ASIN: 'XYZ'}, { ...your new document... }, { upsert: true })

如果找不到卖方为'amazon'且ASIN为'XYZ'的现有文档,这将告诉MongoDB插入新文档 。如果确实找到现有文档,它将用新文档替换它,但据我了解您的情况,这是不相关的。

第二期

只有在新价格字段高于现有价格字段时才更新价格字段,您可以使用$max运算符...

  

...如果指定的值大于字段的当前值,则将字段的值更新为指定值。

您可以这样使用它: db.yourCollection.update({ seller: 'amazon', ASIN: 'XYZ'}, { $max: {price: newPrice} }, { upsert: true })

关于lastUpdatedate字段 - 我想不出在同一个更新操作中有条件地更新它的方法。我认为您需要获取更新操作的结果以确定价格是否已更新,如果是,请更新lastUpdatedate。

答案 2 :(得分:0)

  1. 如果卖家和ASIN组合是唯一的。您应该在它们上创建唯一索引。然后它将永远不会插入(upsert)具有类似卖家和ASIN组合的新文档。参考。 Compound-unique-index
  2. 然后在您的查询更新文档中再添加一个条件$ne: {"price":new_price}
  3. 因此,如果价格相同,它将永远不会插入(插入)新文档,也不会更新现有文档。