17

.NET Razor と mongodb を使用するプロジェクトに取り組んでいます。私はこのようなことをしたいと思います:

@{
    var feeds = DP.Database.GetCollection("feeds").FindAll();
}
<ul>
    @foreach (dynamic feed in feeds)
    {
        <li>@feed.message - @feed.from.name</li>
    }
</ul>

ただし、現在の mongodb C# ドライバー FindAll() は、動的オブジェクトをサポートしていない BsonDocument のコレクションを返します。.NET 4 動的にサポートされている mongodb C# ドライバーを知っている人はいますか?

どうもありがとう

4

5 に答える 5

18

Json.NET を使用して BSON ドキュメントを再シリアル化し、動的として逆シリアル化する MongoDB ドライバーの簡単な拡張機能を作成しました。次のクラスを含めることで、MongoDB クエリをこのように動的に簡単に変換できます。

dynamic obj = collection.FindOneByIdAs<BsonDocument>(someObjectId).ToDynamic();

拡張クラス:

public static class MongoDynamic
{
    private static System.Text.RegularExpressions.Regex objectIdReplace = new System.Text.RegularExpressions.Regex(@"ObjectId\((.[a-f0-9]{24}.)\)", System.Text.RegularExpressions.RegexOptions.Compiled);
    /// <summary>
    /// deserializes this bson doc to a .net dynamic object
    /// </summary>
    /// <param name="bson">bson doc to convert to dynamic</param>
    public static dynamic ToDynamic(this BsonDocument bson)
    {
        var json = objectIdReplace.Replace(bson.ToJson(), (s) => s.Groups[1].Value);
        return Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json);
    }
}

必ず Newtonsoft.Json.dll ( http://james.newtonking.com/projects/json-net.aspx )を参照してください。

于 2012-10-25T07:25:30.293 に答える
14

現在、MongoDB ドライバーでは動的はサポートされていません。これは、.NET 3.5 に基づいているためです。ただし、.NET 4.0 アセンブリは .NET 3.5 アセンブリを参照できるため、.NET 4.0 で IBsonSerializationProvider と IBsonSerializer を記述してダイナミクスをサポートすることができます。

私たち 10gen は、将来的にこれを行うことを検討しています。ご覧になりたい場合は、 https://github.com/craiggwilson/mongo-csharp-driver/tree/dynamicでいくつかのサポートをスパイクしました。間違いなくバグがありますが、それが可能であることを示しています。

于 2012-04-19T14:29:02.960 に答える
4

Maximilianの答えに基づいて構築するだけです。これにより、クエリからダイナミクスのリストが返されます。

    /// <summary>
    /// deserializes this BsonDocument cursor result to a list of .net dynamic objects
    /// </summary>
    /// <param name="cursor">cursor result to convert to dynamic</param>
    /// <returns></returns>
    public static List<dynamic> ToDynamicList(this MongoCursor<BsonDocument> cursor)
    {
        var dynamicList = new List<dynamic>();
        var list = cursor.ToList();
        for (int i = 0, l = list.Count; i < l; i++)
            dynamicList.Add(list[i].ToDynamic());

        return dynamicList;
    }
于 2013-01-22T15:48:35.267 に答える
0

これは古いトピックですが、投稿が行われたときと同じように今日でも関連性があり、双方向サポートの簡単なソリューションを提供するソリューションをまだ見ていません。@Maximilian Scherer コードを変更して、ドキュメントを簡単に再保存できる動的オブジェクトに変換します。

public static class MongoDynamic
{
    /// <summary>
    /// deserializes this bson doc to a .net dynamic object
    /// </summary>
    /// <param name="bson">bson doc to convert to dynamic</param>
    public static dynamic ToDynamic(this BsonDocument bson)
    {
        var json = bson.ToJson(new MongoDB.Bson.IO.JsonWriterSettings { OutputMode = JsonOutputMode.Strict });
        dynamic e =  Newtonsoft.Json.JsonConvert.DeserializeObject<ExpandoObject>(json);
        BsonValue id;
        if (bson.TryGetValue("_id", out id))
        {
            // Lets set _id again so that its possible to save document.
            e._id = new ObjectId(id.ToString());
        }
        return e;
    }
}

使用例:

// Get BsonDocument from db here
BsonDocument doc = ...

// Convert to dynamic.
var d = doc.ToDynamic();

// Lets add a none existant property.
d.Name = "test";

// Assuming you already have your collection set up
collection.Save(new BsonDocument(d));
于 2015-07-31T00:46:15.227 に答える