Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 循环遍历所有Mongo集合并执行查询_Javascript_Mongodb_Mongodb Query_Mongo Shell - Fatal编程技术网

Javascript 循环遍历所有Mongo集合并执行查询

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

首先,我对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
的分配不起作用。 我得到
语法错误:意外标识符
。我需要引用“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