MongoDB C# 迭代作为枚举器
MongoDB C# Iteration as enumerator
我收集了大量 MongoDB(> 10m)的物品。
代码在 C#/.NET 中。
有时,我需要遍历所有文档来修剪数据、进行一些其他维护等。
另外,在某些情况下,我需要能够遍历所有文档,但只获取每个文档的 Id。
我希望文档以 IEnumerable 的形式呈现,供用于处理列表等的代码使用。
我做了以下事情:
private static IAsyncCursor<MongoAlbum> GetCursor(Parameters...)
{
var F = MakeFilter(Parameters...);
var Cursor = Mongo.Driver.FindAsync(F).Result;
return Cursor;
}
internal static IEnumerable<string> IterateThroughAlbumIds(Parameters...)
{
using (var Cursor = GetCursor(Parameters...))
{
while (Cursor.MoveNextAsync().Result)
{
var Batch = Cursor.Current;
foreach (var Document in Batch) yield return Document._id;
}
}
}
internal static IEnumerable<MongoAlbum> IterateThroughAlbums(Parameters...)
{
using (var Cursor = GetCursor(Parameters...))
{
while (Cursor.MoveNextAsync().Result)
{
var Batch = Cursor.Current;
foreach (var Document in Batch) yield return Document;
}
}
}
现在我想知道两件事:
- 是否有更好的方法使异步枚举看起来像 .NET IEnumerable?
- 在枚举过程中,如何告诉驱动程序只return文档的id?
您为此使用 ToEnumerable 扩展方法并仅获取您需要使用投影的 ID。
下面的代码应该可以工作
public class MongoAlbum
{
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string Property { get; set; }
}
IMongoClient client;
IMongoDatabase database;
IMongoCollection<MongoAlbum> collection;
client = new MongoClient("connection string");
database = client.GetDatabase("DB name");
collection = database.GetCollection<MongoAlbum>("collection name");
IEnumerable<string> albums = collection.Find(x => x.Id == "1")
.Project(x => x.Id)
.ToEnumerable<string>();
在这种情况下,它将是一个字符串列表,因为您只会获得 IDs 结果,而在我的 MongoAlbum POCO 中,我使用了一个字符串。
我收集了大量 MongoDB(> 10m)的物品。
代码在 C#/.NET 中。
有时,我需要遍历所有文档来修剪数据、进行一些其他维护等。 另外,在某些情况下,我需要能够遍历所有文档,但只获取每个文档的 Id。
我希望文档以 IEnumerable 的形式呈现,供用于处理列表等的代码使用。
我做了以下事情:
private static IAsyncCursor<MongoAlbum> GetCursor(Parameters...)
{
var F = MakeFilter(Parameters...);
var Cursor = Mongo.Driver.FindAsync(F).Result;
return Cursor;
}
internal static IEnumerable<string> IterateThroughAlbumIds(Parameters...)
{
using (var Cursor = GetCursor(Parameters...))
{
while (Cursor.MoveNextAsync().Result)
{
var Batch = Cursor.Current;
foreach (var Document in Batch) yield return Document._id;
}
}
}
internal static IEnumerable<MongoAlbum> IterateThroughAlbums(Parameters...)
{
using (var Cursor = GetCursor(Parameters...))
{
while (Cursor.MoveNextAsync().Result)
{
var Batch = Cursor.Current;
foreach (var Document in Batch) yield return Document;
}
}
}
现在我想知道两件事:
- 是否有更好的方法使异步枚举看起来像 .NET IEnumerable?
- 在枚举过程中,如何告诉驱动程序只return文档的id?
您为此使用 ToEnumerable 扩展方法并仅获取您需要使用投影的 ID。
下面的代码应该可以工作
public class MongoAlbum
{
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string Property { get; set; }
}
IMongoClient client;
IMongoDatabase database;
IMongoCollection<MongoAlbum> collection;
client = new MongoClient("connection string");
database = client.GetDatabase("DB name");
collection = database.GetCollection<MongoAlbum>("collection name");
IEnumerable<string> albums = collection.Find(x => x.Id == "1")
.Project(x => x.Id)
.ToEnumerable<string>();
在这种情况下,它将是一个字符串列表,因为您只会获得 IDs 结果,而在我的 MongoAlbum POCO 中,我使用了一个字符串。