使用方法:
假设name是主键,则name不存在就插入VALUES后面的值,否则将对应的addr修改为test
INSERT INTO user (name, age, addr)
VALUES
('test',20, 'here')
ON DUPLICATE KEY UPDATE
addr = 'test';
除了上述用法,在使用中还需要注意一些以下几点:
1. user表的部分列如果有默认值,则可以省略,类似insert语法
2. 默认优先判断是否需要update,找不到再insert所有值。
判读update行以主键列优先,unique列次之。主键是auto时,则values后面可忽略,从而实现以unique为准。
3. 在主键为auto时,多个unique以建表中列顺序选择,如下:
假设表有主键A非auto,unique B, unique C:
使用方法:
INSERT INTO test_index(_id, name, age, addr_test)
VALUES('c', 'a', '1', 'b')
ON CONFLICT(_id) DO UPDATE SET
age=5
语法:
db.collection.updateOne(
,
,
{
upsert: ,
writeConcern: ,
collation: ,
arrayFilters: [ , ... ],
hint: // Available starting in MongoDB 4.2.1
}
使用方法:
db.getCollection("test_index").updateOne(
{"_id":"3"},
{ $set: {"i_d" : "3", "age" : 3, "name" : "c", "addr_test":"c" } },
{ upsert: true }
);
1. 语法检测
filter和update 部分不能同时设置_id字段
2. 优先update
update部分,各列可以随意组合,之间是AND操作,匹配到多行时,选择其中一行update
3. insert值是 filter和update 部分的列取并集,都有的部分以update部分为准
4. 问题:mongo没法对同一列insert和update不同的值,有解决方案是要到4.2以后,设置条件判断
5. setOnInsert可以解决insert值问题
db.getCollection("meta").update(
{"client_id":"test"},
{ $set: {"name" : "test2", "state":NumberInt(1) },
$setOnInsert:{"_id":"123","client_id":"test1"} },
{ upsert: true }
);
setOnInsert 只在是insert时更新,相同值client_id以setOnInsert为准