Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.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 shell游标:更新的文档再次到达游标_Javascript_Mongodb - Fatal编程技术网

Javascript Mongo shell游标:更新的文档再次到达游标

Javascript Mongo shell游标:更新的文档再次到达游标,javascript,mongodb,Javascript,Mongodb,我正在尝试迭代MongoShell中的游标,以更新集合中的所有文档 我的目标是重命名文档中的一些字段,因此代码如下所示: var cursor = db.collection.find(); while ( cursor.hasNext() ) { var doc = cursor.next(); printjson(doc); db.collection.update( { _id : doc._id },

我正在尝试迭代MongoShell中的游标,以更新集合中的所有文档

我的目标是重命名文档中的一些字段,因此代码如下所示:

var cursor = db.collection.find();

while ( cursor.hasNext() )
{
    var doc = cursor.next();

    printjson(doc);

    db.collection.update(   { _id : doc._id },
                            {   $set : {    docId : doc.docID,
                                            createdAt : doc.dateAdded,
                                            updatedAt : doc.dateAdded },
                                $unset : {  dateAdded : "",
                                            docID : "" } }
                        );
}
代码非常简单,因此当在一些更新的文档中,
docId
createdAt
updatedAt
字段被设置为
null
时,我感到非常惊讶,尽管在更新之前这些字段的值是合理的

在执行一些调试操作并向代码中添加
printjson
之后,结果表明,循环最初遍历了集合中的所有文档,但随后它没有停止迭代并再次继续遍历已更新的文档。顺便说一下,cursor中的文档数不会根据
cursor.count()
而改变

我试图找出游标的这种行为是一个bug还是一些奇怪的特性。我正在使用Ubuntu12.10和Mongo2.4.6

先谢谢你


是的,我知道
$rename
标签。但是,如果dateAdded在已经更新的文档中不再存在,那么在尝试设置字段updatedAt时,我会遇到同样的问题。这并不否认奇怪的光标行为。

MongoDb的一个特性是,光标可能反映了之前所做的更改。光标不是孤立的。您需要修改循环以处理此功能

光标隔离,因为光标在运行期间未被隔离 在文档的生存期内,对文档进行中间写入操作可能会导致 一个游标,如果一个文档已经存在,它会多次返回该文档 改变。要处理这种情况,请参阅有关快照模式的信息