MongoDB相關(不定期更新)

2021-10-07 08:37:44 字數 3629 閱讀 9621

彙總了一下遇到過的問題,太基本的問題就不寫了(到處都能搜到),不定期更新

1.超時pymongo.errors.autoreconnect

for each in find(***x):

處理操作

update

當處理操作時間比較長(例如十幾分鐘)後,就會報如下錯誤:

pymongo.errors.autoreconnect ip:port [errno 60] operation timed out

而且不是乙個超時,是雙層巢狀超時錯誤

嘗試過修改nocursortimeout或maxtimems(無效)

嘗試過新建乙個mongoclien(出現其他錯誤)

內外網都找了一圈沒有遇到和我完全一樣的錯誤,stackoverflow上有相似但案例並不相同的,該錯誤在文件裡是這麼寫的大致就是需要自己主動捕獲autoreconnect錯誤並且處理異常並重連,比如:

try:

db.insert(...)

except pymongo.errors.connectionfailure:

# handle error.

...

其他解決建議在有

還有人說可以通過修改伺服器上的主mongo總配置來增加連線時間(未嘗試過,但不建議)

建議要麼乖乖按照文件裡說的去操作,要麼為了盡可能避免類似問題,對於可能時間較久的操作,最好在處理完成之後存下資料,再一次性上傳

2.python裡cursor.count()函式總報warning

這個函式已經被廢棄了,目前還能用,但是已經被新的函式代替,即collection.count_documents(),類似find的query指令,只有單純計數的功能,pymongo的文件見

mongo shell同理

3.去重相同字段

對於某乙個欄位去重,只留下一條資料,網上能找到的比較好的指令碼是這樣(mongo shell即js指令碼)

var list=db.getcollection('***').aggregate([

,num:,dups:}},}

} ]);

list.foreach(function(doc)});

})

但是這個指令碼有乙個問題,就是因為addtoset是不保證順序的,這樣最終留下的一條資料就是隨機的,可能會刪除某些處理過的資料,對於想要保留最老或是最新的一條資料而言,可以加一步排序,但是是在dups裡排序,不能在aggregate管道裡先排序,那樣無效。同時如果資料量變得很大以後,返回的結果將會報錯,這時候需要設定引數allowdiskuse:true,這樣才可以返回大量資料例如

var list=db.getcollection('2019_ncov').aggregate([

,num:,dups:}},}

} ],

);list.foreach(function(doc)});

})

為了和其他指令碼統一執行,我移植到了python**裡,思路相似,就是按照pymongo修改一下對應語句即可,不重複貼上。

4.複製collection

原集合名字:db.aaa

複製後的集合名字:db.bbb (複製會自動建立)

db.aaa.find({}).foreach(function(x))

官方文件見

5.按照單日/月進行aggregate統計

如果資料字段是以date格式進行儲存,想要按照日/月進行單獨分組聚合統計,可以採用以下命令

db.getcollection('2019_ncov').aggregate([

},}, 『num』: }},

}])

具體精度可以模擬修改

當然如果只是單純想查詢某一天的資料,直接find裡就行了

db.getcollection('2019_ncov').find(})
aggregate也一樣

db.getcollection('2019_ncov').aggregate([}}])
6.最新時間戳

增量更新,有時需要比較資料裡最新的時間戳,小於該時間就不再插入,查詢mongo最新時間戳的話可以通過find裡的sort+limit來實現

db.getcollection('2019_ncov').find(,).sort().skip(0).limit(1);
aggregate也可以實現,但是邏輯有些不同

db.getcollection('2019_ncov').aggregate([

},},

}}])

這裡順帶安利一下aggregate,用pipeline可以實現各種各樣的功能,find能實現的功能aggregate基本都可以實現,區別在於:

1.find的乙個引數和第二個引數分別是查詢條件和投影的引數,在aggregate裡query引數需要放進'$match',投影的引數需要放進'$project'

2.兩者返回的都是cursor物件,但find可以在後面加上skip()、limit()、sort()等函式繼續操作,aggregate後不可以再跟上limit()等函式,但是在aggregare裡都有這些引數。

aggregare的所有引數如下:

其中pipeline的引數有:

$project:修改輸入文件的結構。可以用來重新命名、增加或刪除域,也可以用於建立計算結果以及巢狀文件。

$match:用於過濾資料,只輸出符合條件的文件。$match使用mongodb的標準查詢操作。

$limit:用來限制mongodb聚合管道返回的文件數。

$skip:在聚合管道中跳過指定數量的文件,並返回餘下的文件。

$unwind:將文件中的某乙個陣列型別欄位拆分成多條,每條包含陣列中的乙個值。

$group:將集合中的文件分組,可用於統計結果。

$sort:將輸入文件排序後輸出。

$geonear:輸出接近某一地理位置的有序文件。

7.經常使用非原地更新的時候會造成文件擴容後的頻繁移動,產生碎片空間。如果填充因子超過了1,比如1.2-1.5,可以嘗試設定usepowerof2size引數,使得空間按照2的指數大小進行分配。

相反的,如果很少有更新,或者更新很少導致document增長時,可以使用nopaddingallocation,節省空間。

8.正則匹配

mongo中使用正規表示式通過$regex來使用,有三種格式:

}

} }

option引數:

i大小寫不敏感

m查詢匹配中使用了錨,例如^(代表開頭)和$(代表結尾),以及匹配n後的字串

x忽視所有空白字元

要求$regex與$option合用

s允許點字元(.)匹配所有的字元,包括換行符。

要求$regex與$option合用

注意:mongo中使用的正規表示式是perl compatible regular expressions (i.e. 「pcre」 ) 

不定期更新部落格

也算是乙個真正程式設計生涯的起點,聽說大神都有自己的部落格。csdn部落格主要是作為乙個詳細的記錄場所,類似log的verbose檔,細緻入微,無孔不入,因此可能更新頻率較高,質量也相對較低。我的意思是將csdn這裡的部落格作為日後更加精煉的部落格 比如個人blog站或者github pages 的...

C STL 不定期更新

一 set set的特性是,所有元素都會根據元素的鍵值自動排序,set的元素不像map那樣可以同時擁有實值 value 和鍵值 key set元素的鍵值就是實值,實值就是鍵值。set不允許兩個元素有相同的鍵值。include初始化 int arr 5 set iset arr,arr 5 或者只定義...

尤拉函式相關(不定期更新)

prime independence lightoj 1356 分析 尤拉線性篩模板,注意此題不需要二分查詢,對於輸入的x,可以從x 1開始找phi x的第乙個數,貌似不會t include using namespace std typedef long long ll typedef int12...