Javascript 循环遍历所有Mongo集合并执行查询
首先,我对mongodb很陌生。这是我的问题,我还没有找到解决办法 假设我有3个不同的收藏Javascript 循环遍历所有Mongo集合并执行查询,javascript,mongodb,mongodb-query,mongo-shell,Javascript,Mongodb,Mongodb Query,Mongo Shell,首先,我对mongodb很陌生。这是我的问题,我还没有找到解决办法 假设我有3个不同的收藏 mongos> show collections collectionA collectionB collectionC 我想创建一个脚本,该脚本迭代该数据库中的所有集合,并在每个集合中查找最后插入的时间戳。以下是mongos内部的工作原理 var last_element = db.collectionA.find().sort({_id:-1}).limit(1); printjson(las
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
的分配不起作用。
我得到语法错误:意外标识符
。我需要引用“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());
});
最后一个元素.next()
产生以下错误:
在src/mongo/shell/query.js:124处出现错误hasNext:false
最后一个元素似乎没有正确保存
有没有关于我做错了什么的建议
更新 尼尔的回答引导我找到了这个解决方案。除了他的代码,我还必须检查函数
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)")
}
}
});
有一个
db.getCollectionNames()
helper方法可以为您执行此操作。然后,您可以实现您的代码:
db.getCollectionNames().forEach(函数(collname){
//查找集合中的最后一项
var last_element=db[collname].find().sort({u id:-1}).limit(1);
//检查它是否为空
if(最后一个元素hasNext()){
//打印它的时间戳
printjson(last_element.next()._id.getTimestamp());
}
})
您可能还需要一个
.hasNext()
在那里签入,以满足可能的空集合。我想说,只有在所有调用都是同步的shell环境中才能安全地执行此操作;异步驱动程序环境中的此解决方案存在风险(许多并行查询快速连续)。@zamnuts在异步环境中有很多方法可以安全地处理列表和数据流。您只需要知道回调来宣布每个迭代。如果你对此不确定,那么你可以问一个问题,有人可能会告诉你怎么做。只是在这里澄清一下。.getTimeStamp()
在这里失败的唯一原因是在每个文档的主键\u id
字段中实际上没有ObjectId
。您应该认真考虑这一点,好像MongoDB将“允许”您在字段中混合类型,因为它是“无模式”的。您不应该将此作为一种常规做法,而应该在出现这种情况时进行更正,以使条目一致。感谢您的通知!如上所述,我是mongo的新手,来自关系数据库背景。我仍然不知道这些集合是如何创建的,也不知道为什么它们没有ObjectID。正如你所说,我需要纠正这一点,并需要了解原因和方式。谢谢
mongos> show collections
collectionA
collectionB
collectionC