彙總了一下遇到過的問題,太基本的問題就不寫了(到處都能搜到),不定期更新
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...