使用MongoDB C#驱动程序(v2.0)处理收集事件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用MongoDB C#驱动程序(v2.0)处理收集事件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3640字,纯文字阅读大概需要6分钟。
内容图文
![使用MongoDB C#驱动程序(v2.0)处理收集事件](/upload/InfoBanner/zyjiaocheng/882/1e34fbd0141143e2aa283a1de6687f81.jpg)
使用新的MongoDB驱动程序(v2.0)非常困难.您在网络上找到的大多数示例仍然引用旧版驱动程序.至少可以说,Mongo官方网站上的The reference manual for v2.0是“简洁的”.
我试图做一个简单的事情:检测何时更改了一个集合,以便将C#事件转发到我的服务器应用程序.
为此,我找到了以下C#example(请参见下文),我正在尝试将其转换为新的API.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
namespace TestTailableCursor {
public static class Program {
public static void Main(string[] args) {
try {
var server = MongoServer.Create("mongodb://localhost/?safe=true");
var database = server["test"];
if (database.CollectionExists("capped")) {
database.DropCollection("capped");
}
var collectionOptions = CollectionOptions.SetCapped(true).SetMaxDocuments(5).SetMaxSize(10000);
var commandResult = database.CreateCollection("capped", collectionOptions);
var collection = database["capped"];
// to test the tailable cursor manually insert documents into the test.capped collection
// while this program is running and verify that they are echoed to the console window
// see: http://www.mongodb.org/display/DOCS/Tailable+Cursors for C++ version of this loop
BsonValue lastId = BsonMinKey.Value;
while (true) {
var query = Query.GT("_id", lastId);
var cursor = collection.Find(query)
.SetFlags(QueryFlags.TailableCursor | QueryFlags.AwaitData)
.SetSortOrder("$natural");
using (var enumerator = (MongoCursorEnumerator<BsonDocument>) cursor.GetEnumerator()) {
while (true) {
if (enumerator.MoveNext()) {
var document = enumerator.Current;
lastId = document["_id"];
ProcessDocument(document);
} else {
if (enumerator.IsDead) {
break;
}
if (!enumerator.IsServerAwaitCapable) {
Thread.Sleep(TimeSpan.FromMilliseconds(100));
}
}
}
}
}
} catch (Exception ex) {
Console.WriteLine("Unhandled exception:");
Console.WriteLine(ex);
}
Console.WriteLine("Press Enter to continue");
Console.ReadLine();
}
private static void ProcessDocument(BsonDocument document)
{
Console.WriteLine(document.ToJson());
}
}
}
一些(相关)问题:
>使用新驱动程序是否正确?
>如果是这样,如何设置收集选项(如上面示例中的SetCap).新的API包含名为“ CollectionSettings”的内容,
无关.
>我唯一依靠传统驱动程序的选择吗?
谢谢你的帮助.
解决方法:
Is my only option to rely on the legacy driver?
没有.
[…] how do I set collection options (like SetCap in the example above). The new API includes something called “CollectionSettings”, which seems totally unrelated.
现在有CreateCollectionSettings. CollectionSettings是驱动程序的设置,即一种指定每个集合默认行为的方法. CreateCollectionOptions可以这样使用:
db.CreateCollectionAsync("capped", new CreateCollectionOptions
{ Capped = true, MaxDocuments = 5, MaxSize = 10000 }).Wait();
Is that the right approach with the new driver?
我认为是这样,可尾游标是数据库的功能,避免轮询总是很有意义的.
我转换了代码的要旨,它似乎可以在我的机器上运行:
在Web或UI应用程序中为careful when using .Result and .Wait().
private static void ProcessDocument<T>(T document)where T : class
{
Console.WriteLine(document.ToJson());
}
static async Task Watch<T>(IMongoCollection<T> collection) where T: class
{
try {
BsonValue lastId = BsonMinKey.Value;
while (true) {
var query = Builders<T>.Filter.Gt("_id", lastId);
using (var cursor = await collection.FindAsync(query, new FindOptions<T> {
CursorType = CursorType.TailableAwait,
Sort = Builders<T>.Sort.Ascending("$natural") }))
{
while (await cursor.MoveNextAsync())
{
var batch = cursor.Current;
foreach (var document in batch)
{
lastId = document.ToBsonDocument()["_id"];
ProcessDocument(document);
}
}
}
}
}
catch (Exception ex) {
Console.WriteLine("Unhandled exception:");
Console.WriteLine(ex);
}
}
内容总结
以上是互联网集市为您收集整理的使用MongoDB C#驱动程序(v2.0)处理收集事件全部内容,希望文章能够帮你解决使用MongoDB C#驱动程序(v2.0)处理收集事件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。