Javascript Mongo shell游标:更新的文档再次到达游标
我正在尝试迭代MongoShell中的游标,以更新集合中的所有文档 我的目标是重命名文档中的一些字段,因此代码如下所示: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 },
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的一个特性是,光标可能反映了之前所做的更改。光标不是孤立的。您需要修改循环以处理此功能
光标隔离,因为光标在运行期间未被隔离
在文档的生存期内,对文档进行中间写入操作可能会导致
一个游标,如果一个文档已经存在,它会多次返回该文档
改变。要处理这种情况,请参阅有关快照模式的信息