4

ドキュメントのリストを含むルートドキュメントがあり、保存/挿入すると、ルートドキュメントは常にMongoDBからIDを取得しますが、リスト内のドキュメントは取得しません。それらはと同じままObjectId.Emptyです。何か間違ったことをしているのか、それとも意図した動作なのかわかりません。

これが私がやろうとしていることの例です:クラスを考えると:

public class Foo
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public IList<Bar> Bars { get; set; }
}

public class Bar
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
}

工場あり:

public class Factory
{
    public Foo CreateFoo(string name)
    {
        return new Foo {
            Id = new ObjectId(),
            Name = name,
            Bars = new List<Bar>()
        };
    }

    public Bar CreateBar(string name)
    {
        return new Bar {
            Id = new ObjectId(),
            Name = name
        };
    }
}

このようなサンプルを実行すると、次のようになります。

public class Program
{
    static void Main(string[] args)
    {
        var client = new MongoClient("mongodb://localhost");
        var server = client.GetServer();
        var database = server.GetDatabase("Example1");
        if (!database.CollectionExists("foos")) database.CreateCollection("foos");

        var factory = new Factory();
        var foo1 = factory.CreateFoo("first");
        foo1.Bars.Add(factory.CreateBar("bar"));
        var collection = database.GetCollection("foos");
        collection.Insert(foo1);

        var foo2 = factory.CreateFoo("second");
        collection.Insert(foo2);
        foo2.Bars.Add(factory.CreateBar("bar"));
        collection.Save(foo2);
    }
}

foo1foo2getの両方_idがMongoDBによって生成されますが、いずれも生成されBarsません。すべてはBarsまだ持っていObjectId.Emptyます。これで簡単な解決策は、使用するようにファクトリを更新することですObjectId.GenerateNewId()が、DBから生成される方が快適です。誰かがこれについて何か洞察を持っていますか?私は何か間違ったことをしていますか?これも可能ですか?入力ありがとうございます。

4

3 に答える 3

1

それは意図された振る舞いです。各ドキュメント(サブドキュメントではない)には_idがあり、空の場合は自動的に割り当てられます。

別のバーのコレクションを用意してFooドキュメントから参照するか、ObjectIdを手動で生成する必要があります。

あなたがファクトリー[またはリポジトリ]からそれをしているなら、それはしっかりしているでしょう。

編集:

また、使用する場合

[BsonRepresentation(BsonType.ObjectId)]
string Id {get;set;}

これは、objectId値に簡単にアクセスできることを意味しますが、それでもObjectIdとして保存されます。

于 2013-02-04T00:23:07.130 に答える
1

_idドライバーは、フィールドがコレクションのとして識別された場合にのみ Id フィールドを生成します。あなたの場合、ドキュメントBar内に埋め込まれていFooます。

Barしたがって、自動生成された Id フィールドを持つことは意味がありません。

Barあなたの例では、一意の を持つ理由は本当にありません_id。コレクションにクエリを実行すると、 に基づいてクエリが実行され、応答でオブジェクトが利用可能になり_idますFooBar

これは間違いなく意図された動作です。

于 2013-02-04T20:25:04.497 に答える