MongoDB C#Iteration作为枚举器

时间:2016-05-12 00:59:58

标签: c# .net mongodb-.net-driver

我有很多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?
  • 在枚举期间,如何告诉驱动程序只返回文档的ID?

1 个答案:

答案 0 :(得分:1)

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