mongodb 不存在就插入

不存在插入,存在不做任何處理。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章