MongoDB增量或Upsert

Bro*_*shi 6 mongodb

鉴于以下文档结构:

{
         '_id': ObjectId("559943fcda2485a66285576e"),
         'user': '70gw3',
         'data': [
            {
              'date': ISODate("2015-06-29T00:00:00.0Z"),
              'clicks': 1,
            },
            {
              'date': ISODate("2015-06-30T00:00:00.0Z"),
              'clicks': 5,
            },
          ]
    }
Run Code Online (Sandbox Code Playgroud)

如果它不存在[整个文档特定日期],如何增加和增加的clicks值,使它等于?2015-06-301

bag*_*rat 2

不幸的是,不可能在单个查询中实现您的目标。但您可以执行以下操作

var exists = db.yourCollection.find(
    {'_id': ObjectId("559943fcda2485a66285576e"), 'data.date': <your date>}
).count()
Run Code Online (Sandbox Code Playgroud)

此查询将返回数组中具有指定日期的文档数_id和具有指定日期的对象data。由于该_id领域是唯一的,您最多只能得到一个结果。如果数组中不存在这样的元素data,则不会得到任何结果。因此,您有以下情况:

  • 存在== 1:存在具有指定日期的元素
  • 存在 == 0:存在具有指定日期的元素

那么这可以成为你的条件:

if (exists) {
    db.yourCollection.update({_id: <your id>, 'data.date': <your date>}, {$inc: {'data.$.clicks': 1}})
} else {
    if (db.runCommand({findAndModify: 'yourCollection', query: {_id: <your id>, 'data.date': {$ne: <your date>}}, update: {$push: {data: {date: <your date>, clicks: 1}}}}).value) {
         db.yourCollection.update({_id: <your id>, 'data.date': <your date>}, {$inc: {'data.$.clicks': 1}})
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 文档结构是否正确?“data”应该是一个数组吗? (2认同)