1 回答

TA貢獻1852條經(jīng)驗 獲得超1個贊
這是一個純粹來自 MongoDB shell 的解決方案。
我的解決方案依賴于聚合管道和使用項目操作。在你的問題中你說,
每個文檔可以有不同的數(shù)組大小 (fetch_dates) 但結構是相同的。
基于此,我認為沒有理由必須遍歷數(shù)據(jù)庫中的所有文檔。相反,您可以只從數(shù)據(jù)庫中提取一個文檔并使用它來提出一個應該適用于數(shù)據(jù)庫中所有文檔的投影。這是我想出的代碼。
function buildProjection(doc, prepend) {
? var projection = {};
? Object.keys(doc)
? ? .forEach(key => {
? ? ? var val = doc[key];
? ? ? var path = prepend==null? key : prepend + '.' + key;
? ? ? if (key == '_id') {
? ? ? ? projection[key] = 1;
? ? ? } else if ( Array.isArray(val) ) {
? ? ? ? projection[key] = { '$slice' : [ '$'+path, -1 ] };
? ? ? } else if ( typeof val === 'object' && val !== null ) {
? ? ? ? projection[key] = buildProjection(val, path);
? ? ? } else {
? ? ? ? projection[key] = 1;
? ? ? }
? ? });
? ? return projection;
}
/*
?* Pull a document out of the database and build the projection based off of it.
?* You may want to specify a particular document in the findone
?* that you know to be structured correctly
*/
var sample = db.myCollection.findOne({});
var projection = buildProjection(sample, null);
db.myCollection.aggregate([
? // apply the build projection
? { $project: projection },
? // insert results into another collection
? { $out: 'rebuiltWithLatest' }
]);
我不確定您是否想將結果保存在另一個集合中。我用這個解決方案這樣做了。花了幾秒鐘,但我用 300k 文檔運行這個沒有問題,這很像你的鏈接示例。
如果您只想查看文檔,請從聚合管道中刪除 $output 操作。然后它將返回一個游標對象,您可以迭代該對象以查看其他結果。
- 1 回答
- 0 關注
- 144 瀏覽
添加回答
舉報