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;
            }
        }
    }

现在我想知道两件事:

您为此使用 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 中,我使用了一个字符串。