首先,我对mongodb很新。这是我的问题,我无法找到解决方案。
假设我有3个不同的收藏品。
mongos> show collections
collectionA
collectionB
collectionC
我想创建一个脚本,遍历此数据库中的所有集合,并在每个集合中查找最后插入的时间戳。这是在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()
会产生以下错误:
错误hasNext:false在src / mongo / shell / query.js:124
似乎last_element未正确保存。
有关我做错的任何建议吗?
更新
Neils回答了我的解决方案。除了他的代码,我还要检查函数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)")
}
}
});
答案 0 :(得分:36)
有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()
检查以满足可能的空集合。