2014-08-28 60 views
14

首先,我對mongodb很陌生。這是我的問題,我一直無法找到解決方案。遍歷所有Mongo收藏並執行查詢

比方說,我有3個不同的集合。

mongos> show collections 
collectionA 
collectionB 
collectionC 

我希望創建一個遍歷IND該數據庫中所有集合的腳本,發現在這些藏品最後插入的時間戳。這裏是mongos裏面的工作。

var last_element = db.collectionA.find().sort({_id:-1}).limit(1); 
printjson(last_element.next()._id.getTimestamp()); 
ISODate("2014-08-28T06:45:47Z") 

1.問題(遍歷所有集合)

是否有可能對某事物。喜歡。

var my_collections = show collections; 
my_collections.forEach(function(current_collection){ 
    print(current_collection); 
}); 

問題在這裏,my_collections的任務不起作用。我收到SyntaxError: Unexpected identifier。我需要引用'show'語句嗎?它甚至有可能嗎?

2.問題(存儲集合中的JS VAR)

我可以通過執行此替代方法問題1:

var my_collections = ["collectionA", "collectionB", "collectionC"]; 
my_collections.forEach(function(current_collection){ 
    var last_element = db.current_collection.find().sort({_id:-1}).limit(1); 
    print(current_collection); 
    printjson(last_element.next()._id.getTimestamp()); 
}); 

last_element.next()產生以下錯誤:

error hasNext: false at src/mongo/shell/query.js:124

看來last_element沒有正確保存。

關於我在做什麼的任何建議是錯誤的?


UPDATE

尼爾斯的答案使我這個解決方案。除了他的代碼,我不得不檢查函數getTimestamp是否真的存在。對於某些「虛擬」集合,似乎沒有_id屬性。

db.getCollectionNames().forEach(function(collname) { 
    var last_element = db[collname].find().sort({_id:-1}).limit(1); 
    if(last_element.hasNext()){ 
     var next = last_element.next(); 
     if(next._id !== undefined && typeof next._id.getTimestamp == 'function'){ 
      printjson(collname + " >> "+next._id.getTimestamp()); 
     }else{ 
      print(collname + " undefined!! (getTimestamp N/A)") 
     } 
    } 
}); 
+1

只是在這裏澄清。 '.getTimeStamp()'會在這裏失敗的唯一原因是你在每個文檔的主鍵「_id」字段中實際上沒有「ObjectId」。你應該真的看看這個,好像MongoDB會「允許」你在字段中混合類型,因爲它是「無模式的」,你不應該把它作爲一般的做法,而應該真正地糾正這個問題發生這種情況可以使條目保持一致。 – 2014-09-01 11:11:30

+0

感謝您的通知!如前所述,我對mongo非常陌生,來自關係數據庫背景。 我還不確定這些集合是如何創建的,也不知道爲什麼他們沒有ObjectID。正如你所說,我需要糾正這一點,並需要了解爲什麼和如何。謝謝! – cb0 2014-09-01 20:28:32

回答

25

還有就是db.getCollectionNames()的輔助方法,這是否適合你。然後,您可以實現您的代碼:

db.getCollectionNames().forEach(function(collname) { 
    // find the last item in a collection 
    var last_element = db[collname].find().sort({_id:-1}).limit(1); 
    // check that it's not empty 
    if (last_element.hasNext()) { 
     // print its timestamp 
     printjson(last_element.next()._id.getTimestamp()); 
    } 
}) 

你可能還需要一個.hasNext()檢查在那裏,以應付可能的空集合。

+0

我想說,在所有調用都是同步的shell環境中,這只是安全的。該解決方案在異步驅動程序環境中存在風險(快速連續執行許多並行查詢)。 – zamnuts 2014-09-01 07:46:37

+0

@zamnuts有很多方法可以在異步環境中安全地處理列表和數據流。你只需要知道回調來宣佈每個迭代。如果你對此不確定,那麼你總是可以提出一個問題,而有人可能會告訴你如何去做。 – 2014-09-01 08:15:19

+0

這對我不起作用: '不能調用'undefined'的方法'...' mongo version 2.6.6 – 2015-02-06 19:29:09