web-dev-qa-db-ja.com

MongoDbサブドキュメントでid-sを使用することは適切ですか?

私は現在、MongoDbと公式のC#ドライバーを使用してシンプルなWebアプリケーションを構築することにより、NoSQLに慣れています。 NoSQLの概念を正しく理解している場合は、集約ルートドキュメントのみにIDがあり、子コレクションにはIDがありません。

たとえば、C#コードでは、次の2つのPoco-sがあります。

public class User
{
    public BsonObjectId Id { get; set; }

    [BsonElement("pets")]
    public List<Pet> Pets { get; set; } 
}

public class Pet
{
    public string Name { get; set; }
}

ペット用に個別のCRUDビューが必要な場合、どのように解決しますか?リレーショナルデータベースでは、クエリ文字列にペットIDを含めることでこれを行いますが、NoSQLではわかりません。

この質問は、「ペット」サブドキュメントにIdフィールドを追加しようとしたときに発生しました。ペットのIDの代わりに、「_ csharpnull」という名前のオブジェクトがデータベースに追加されました。

たとえば、これを行うと:

public class User
{
    public BsonObjectId Id { get; set; }

    [BsonElement("pets")]
    public List<Pet> Pets { get; set; } 
}

public class Pet
{
    public BsonObjectId Id { get; set; }
    public string Name { get; set; }
}

次に、このドキュメントがデータベースに挿入されます。

{
    "_id" : ObjectId("5643a1f9766bcf0fc0b26f14"),
    "pets" : [ 
        {
            "_id" : {
                "_csharpnull" : true
            },
            "Name" : "T-Rex"
        }
    ]
}

私の予想される行動が次のようなものになるとき:

{
    "_id" : ObjectId("5643a1f9766bcf0fc0b26f14"),
    "pets" : [ 
        {
            "_id" : ObjectId("56439adc766bcf49a0639992"),
            "Name" : "T-Rex"
        }
    ]
}
1
AlanWakeUp

「はい」または「いいえ」という特定の基準については認識していませんが、私の経験では、これは多くの場合可能であり、実行する必要があります。

Petをさまざまな操作で独自に処理したい場合は、IDが必要です。 MongoDBで最も簡単な方法は、ObjectIDを与えるだけです。

しかし、メインドキュメントと常に一緒に表示されるサブドキュメントがある場合など、これが必要でない場合にも遭遇しました。

私は特にC#に精通していませんが、実行しようとしていることは間違いなくJavaで機能します。実際にObjectIDを手動で初期化していることを確認してください。 MongoDBは、コレクションの最上位のドキュメントにオブジェクトIDを作成しますが、子ドキュメントには同じことを行いません。

1
ced-b

NoSQLの概念を正しく理解している場合は、集約ルートドキュメントのみにIDがあり、子コレクションにはIDがありません。

リレーショナルデータベースやNoSQLドキュメント指向のデータベースでさえ、すべての場合において ドメイン駆動設計 と完全に一致するかどうかはわかりません。

ドキュメントにオブジェクトID /主キーがあるか、実装の詳細と見なすべきではありませんか(注意しないと、それは[〜#〜]になります[〜#〜]モデリングプロセスに影響します)。

さらに重要なことは、その特定のドキュメントの扱い方です。集約ルート境界の外側からIDでアクセスしますか?それを削除して完全に同じオブジェクトを再作成した場合、IDが異なるとアプリケーションロジックに何らかの影響がありますか?等。

IDを使用せずに値をアドレス指定する誘惑がないように、IDなしで値オブジェクトを作成する方が良いと思います。ただし、何らかの理由で必要な場合は、実装の詳細を検討し、最初にドメインロジックの追跡に集中してください。

0