考虑这个假设的片段:
using (mongo.RequestStart(db))
{
var collection = db.GetCollection<BsonDocument>("test");
var insertDoc = new BsonDocument { { "currentCount", collection.Count() } };
WriteConcernResult wcr = collection.Insert(insertDoc);
}
它插入一个新文档,其中“currentCount”设置为collection.Count()返回的值。
这意味着两次往返服务器。一个用于计算collection.Count()和一个用于执行插入。有没有办法在一次往返中做到这一点?
换句话说,在插入时,可以在服务器上计算分配给“currentCount”的值吗?
谢谢!
答案 0 :(得分:1)
目前无法做到这一点(Mongo 2.4)。
即将推出的2.6版本应该有批处理操作支持,但我不知道它是否支持不同类型的批处理操作以及使用另一个操作的一个操作的结果。
但是,您可以通过在JavaScript中使用eval表达它来在服务器上执行此逻辑:
collection.Database.Eval(new BsonJavaScript(@"
var count = db.test.count();
db.test.insert({ currentCount: count });
");
但是不推荐这样做,原因有以下几点:你失去了写入问题,在安全性方面非常不安全,它需要管理员权限,它拥有全局写锁定,并且它不适用于分片集群:)
我认为目前最好的路线是在两个查询中执行此操作。 如果您正在寻找原子更新或计数器(与您的示例完全匹配但看起来有些相关),请查看findAndModify和$inc operator of update。
答案 1 :(得分:0)
如果您有一个大型集合而且您正在寻找节省CPU,那么建议您创建另一个名为counters
的集合,该集合每个集合只有一个您想要计算的文档并增加与该文档相关的文档每次插入文档时都要收集。
看来你可以在你的查询中放置一个JavaScript函数,所以也许它可以在一次旅行中完成,但我没有在我自己的应用程序中实现它,所以我无法确认。