mongo命令行下迭代游标
db.collection.find()方法返回一个游标。要访问文档, 你需要遍历游标。然而,在mongo命令行,如果返回的游标使用var关键字没有赋值给一个变量,然后将游标会自动迭代20次,最多打印结果里拳20个文档。以下说明用手动迭代游标或使用迭代索引的方式来访问文档。
一、手动迭代游标
在mongo命令行下,当您分配从find()方法返回的游标给一个用var关键字命名的变量,游标不会自动迭代。
在mongo命令行下您可以调用游标变量迭代20次,然后打印匹配的文档,就像下面的例子:
var myCursor = db.inventory.find( { type: 'food' } );
myCursor
您也可以使用游标的next()方法来访问文档,就像下机的例子:
var myCursor = db.inventory.find( { type: 'food' } );
while (myCursor.hasNext()) {
print(tojson(myCursor.next()));
}
作为一种替代的打印操作,考虑用printjson()辅助方法取代print(tojson()):
var myCursor = db.inventory.find( { type: 'food' } );
while (myCursor.hasNext()) {
printjson(myCursor.next());
}
你可以使用游标的foreach()方法遍历游标访问文档,就像下面的例子:
var myCursor = db.inventory.find( { type: 'food' } );
myCursor.forEach(printjson);
游标方法的更多信息查看JavaScript游标方法和你......
分析查询性能
explain()游标方法允许你检查查询系统的操作。此方法用于分析查询的效率是有用的,以及用于确定查询如何使用索引。 explain() 方法测试查询操作,而不是对查询性能的计时。因为explain()尝试多个查询计划,它不反映查询性能的精确计时。
一、评估一个查询的性能
使用explain()方法,在find()方法返回一个游标时调用这个方法。
例如:
评估inventory集合type字段的一个查询,在type字段上有一个索引。
db.inventory.find( { type: 'food' } ).explain()
考虑下面的结果:
{
"cursor" : "BtreeCursor type_1",
"isMultiKey" : false,
"n" : 5,
"nscannedObjects" : 5,
"nscanned" : 5,
"nscannedObjectsAllPlans" : 5,
"nscannedAllPlans" : 5,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : { "type" : [
&......
修改文档
在MongoDB中, db.collection.update()和db.collection.save()方法修改在集合中已存在的文档。db.collection.update()提供了额外的修改控制。例如,您可以用db.collection.update()修改现有的数据或修改一组匹配查询的文档。此外,db.collection.save()替换具有相同_id字段的现有文档。
本文档提供了在mongo命令行下使用两个方法更新操作的例子。
一、用update()方法修改多个文档
默认情况下,update()方法更新与选择条件匹配到单一的文档。用multi选项设置为true调用update()方法来更新多个文档。 [1]
db.inventory.update(
{ type : "book" },
{ $inc : { qty : -1 } },
{ multi: true }
)
更多的例子,请参阅update()。
[1]
这显示了MongoDB 2.2及以后的语法。2.2版本之前的语法,请参阅update()。
二、用save()方法修改一个文档
save()方法可以替换一个现有的文档。替换一个文档用save()方法,用_id字段匹配一个现有的文档来进行修改。
下面的例子完全替换了在inventory集合中_id字段为10的一个文档:
db.inventory.save(
{
_id: 10,
type: "misc",
item: "placard"
}
)
进一步的例子,请参阅save()。
......
删除文档
在MongoDB中,db.collection.remove()方法将文档从一个集合中删除。你可以从一个集合,删除所有文档。删除符合条件的所有文档,或限制操作只删除一个文档。
本教程提供了在mongo命令任下使用db.collection.remove()方法删除操作的示例。
一、删除所有文档
从集合中删除所有的文档,传递一个空查询文档{}到remove()方法。remove()方法不会删除索引。
下面的例子将删除inventory集合的所有文档:
db.inventory.remove({})
从集合中删除所有的文档,还可以更有效地使用drop()方法来删除整个集合,包括索引,然后重建集合和重建索引。
二、删除匹配条件的文档
要删除匹配删除条件的文件,调用remove()方法加<query>参数。
下面的例子将删除inventory集合中类型字段等于食品的所有文档:
db.inventory.remove( { type : "food" } )
对于大的删除操作,可能是更有效的复制文档在一个新的集合,然后在原来的集合上使用drop()。
三、删除与条件匹配单个文件
要删除一个文件,调用remove()方法结合justOne参数设置为true或1。
下面的例子将删除inventory集合中类型字段等于食品的一个文档:
db.inventory.remove( { type : "food" }, 1 )
要按一些特定的顺序删除单个文档,请使用findAndModify()方法。
......
执行两阶段提交
一、概要
本文档提供了多文档更新或“多文档事物处理”采用两阶段模式提交的方式将数据写入到多个文档。此外,你可以扩展这一过程,以提供回滚一样的功能。
二、背景
MongoDB数据库单一的文档操作总是原子的;然而,操作涉及多个文档,这些文件通常被称为“多文件事物处理”,不是原子的。由于文档可以是相当复杂的,包含多个“嵌套”的文件,单个文档原子为许多实用的用例的提供了必要的支持。
即使单文档的原子操作力,也存在需要多文档处理情况。当执行一个顺序操作组成的事务,某些问题发生,如:
原子性:如果一个操作失败,先前的操作在事务必须“回滚”到先前的状态(例如“nothing,”“all 或者 nothing”)。
一致性:如果一个主要失败(例如网络、硬件)中断事务,数据库必须能够恢复一致的状态。
对于需要多文档事物处理的情况下,可以实现两阶段提交您的应用程序提供这类多文档的更新支持。使用两阶段提交保证了数据的一致性,在出错的情况下,与此前的事物状态是可以恢复的。在该过程中,然而,文档可以表示待处理数据和状态。
请注意
在与MongoDB中因为只有单文档操作是原子,两阶段提交只能提供transaction-like语义。在两阶段提交或回滚时应用程序有可能返回中间点的中间数据。
三、模式
概述
考虑这样一个场景,您想从帐户转帐资金到账......