如何使用mongodb-insert-on-duplicate-key-update?

时间:2017-09-03 12:01:38

标签: mongodb mongo-shell

我有一个包含3列的表:name,age,tm。

它有(名称,年龄)的复合索引

如果使用MySQL,SQL可能是这样的:

insert into tt(name,age,tm) values('chenlong', 29, 1504437683) on duplicate key update tm = 1504437683

如何在mongodb中使用?

db.tt.find()

{ "_id" : ObjectId("59abe43ade8616599017a085"), "name" : "chenlong", "age" : 29, "tm" : ISODate("2017-09-03T11:32:04.156Z") }

    db.tt.update(
        {name:'chenlong',age:29},
        {
            $set: {tm:ISODate()},
            $setOnInsert: {tm:ISODate()}
        },
        { upsert: true }
    )

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

    db.tt.find()

{ "_id" : ObjectId("59abe43ade8616599017a085"), "name" : "chenlong", "age" : 29, "tm" : ISODate("2017-09-03T11:33:09.359Z") }

没关系,列tm变得更新了,但添加了一条新记录,错误发生了。

db.tt.update(
    {name:'chenlong',age:30},
    {
        $set: {tm:ISODate()},
        $setOnInsert: {tm:ISODate()}
    },
    { upsert: true }
)

WriteResult({
        "nMatched" : 0,
        "nUpserted" : 0,
        "nModified" : 0,
        "writeError" : {
                "code" : 16836,
                "errmsg" : "**Cannot update 'tm' and 'tm' at the same time**"
        }
})

如何解决问题?感谢。

1 个答案:

答案 0 :(得分:0)

这将有效

db.tt.update(
    {name:'chenlong',age:30},
    {
        $set: {tm:ISODate()}    
    },
    { upsert: true } 
)

如果文档匹配,它将更新或发生upsert。