一
不存在插入,存在不做任何處理。
db.companies.updateOne(
{"company": "test"},
{ $setOnInsert: { "name": "nameVal2", ... } },
{ upsert: true }
)
{"company": "test"}是匹配條件
{ $setOnInsert: { "name": "nameVal2", ... } } 查詢不到就會插入這裏設定的值
{ upsert: true } 開啓upsert
如果是項不存在插入,存在更新,請查看findandmodify/findoneandupdate
二
進一步提要求,每間隔60秒/1分鐘插入一條數據。
比如有很多重複的數據(日誌,告警)等,相同的內容不想重複插入,設定間隔,比如1小時等再插入新的,如何做呢?
還是使用updateOne,過濾條件就是,查找最新的時間(也就是最大的時間),方法就是按照時間倒序排序,查找第一條記錄,也就是最後插入的一條記錄,然後判斷是否在時間間隔內,如果在,則不做任何操作(updateone原本設定的是更新,我們不給定更新內容,則不做任何操作),如果不在時間間隔內,則說明超過時間間隔了,插入。舉例如下:
db.getCollection("xxx").updateOne(
{ts: {$gt: new Date(ISODate().getTime() - 60000)}},
{$setOnInsert: {"level": 3, "type": "bbb", "ts": new Date()}},
{
upsert: true,
$sort: {ts: -1},
$limit: 1
}
)
{ts: {$gt: new Date(ISODate().getTime() - 60000)}} 判斷ts字段(ISODate類型)是否大於當前時間減去60秒,也就是還在時間間隔內
{$setOnInsert: {"level": 3, "type": "bbb", "ts": new Date()}} 設定不滿足條件時的插入內容
upsert: true 開啓更新插入
$sort: {ts: -1} ts倒序插敘
$limit: 1 只獲取第一條數據
https://www.mongodb.com/docs/v7.0/reference/method/db.collection.updateOne/#mongodb-method-db.collection.updateOne
https://stackoverflow.com/questions/48220677/mongodb-how-to-insert-only-if-does-not-exists-no-update-if-exist
https://stackoverflow.com/questions/30996728/adding-subtracting-days-to-isodate-in-mongodb-shell