Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /
/ / /

埋め込み関係と手動参照

このガイドでは、 MongoDB Entity Framework コア プロバイダーを使用して、 MongoDBデータベース内のドキュメント間の関係をモデル化する方法を学習できます。 FS コア プロバイダーは、次の関係タイプをサポートしています。

  • 埋め込み関係: 親ドキュメント内に直接埋め込まれたサブドキュメント。これは、 MongoDBの 1 対 1 および 1 対多の関係に推奨されるアプローチです。

  • 手動参照:ドキュメントをサブドキュメントとして埋め込むのではなく、フィールドにIDを保存して別のドキュメントを参照するドキュメント。このアプローチは、多対多の関係のモデル化や、ドキュメントに単独でアクセスする必要がある場合に適しています。

親ドキュメントにサブドキュメントを埋め込むには、埋め込みドキュメントのモデルを所有するエンティティとして指定します。埋め込み関係は、関係をモデル化し、一緒にアクセスする頻繁にアクセスするドキュメントのパフォーマンスを向上させるMongoDBネイティブの方法です。

所有 エンティティは、次の方法で指定できます。

  • [Owned] 属性: [Owned]サブドキュメントのモデルクラスに データ注釈属性を適用します。このアプローチは宣言的で簡潔ですが、所有されている型のすべての使用にグローバルに適用されるため、柔軟ではありません。

  • Flutter API : OwnsOne()OwnsMany()DbContext構成で メソッドまたは メソッドを呼び出します。このアプローチではより制御と柔軟性が向上するため、 モデルクラス を変更しなくても、特定のエンティティに対して異なる方法で関係を構成できます。

次のセクションでは、単一および複数の所有者エンティティをモデル化するための、これらのアプローチの例を示します。

親ドキュメントに単一のドキュメントを埋め込むには、DbContext 構成で OwnsOne() メソッドを呼び出すか、埋め込みクラスに [Owned] 属性を適用します。

次の例では、埋め込み Addressドキュメントを含む Customer エンティティを示しています。対応する構文を確認するには、[Owned] Attribute タブまたは Fluent APIタブを選択します。

[Owned]
public class Address
{
public string Street { get; set; } = null!;
public string City { get; set; } = null!;
public string Country { get; set; } = null!;
}
public class Customer
{
public ObjectId Id { get; set; }
public string Name { get; set; } = null!;
public Address Address { get; set; } = null!;
}
public class CustomerDbContext : DbContext
{
public DbSet<Customer> Customers { get; set; } = null!;
public CustomerDbContext(DbContextOptions options) : base(options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Customer>(c =>
{
c.OwnsOne(c => c.Address);
c.ToCollection("customers");
});
}
}

Customer エンティティを保存すると、 MongoDB はAddressCustomerドキュメント内の埋め込みドキュメントとして保存します。次のJSON は、 MongoDBでこの関係がどのように表示されるかを示しています。

{
"_id": ObjectId("..."),
"Name": "John Doe",
"Address": {
"Street": "123 Main St",
"City": "New York",
"Country": "USA"
}
}

親ドキュメントに複数のドキュメントを埋め込むには、OwnsMany() メソッドを呼び出すか、埋め込みクラスに [Owned] 属性を適用し、コレクションプロパティを定義します。

次の例では、複数の埋め込み Order ドキュメントを含む Customer エンティティを示しています。対応する構文を確認するには、[Owned] Attribute タブまたは Fluent APIタブを選択します。

[Owned]
public class Order
{
public string Product { get; set; } = null!;
public int Quantity { get; set; }
}
public class CustomerWithOrders
{
public ObjectId Id { get; set; }
public string Name { get; set; } = null!;
public List<Order> Orders { get; set; } = new();
}
public class OrderDbContext : DbContext
{
public DbSet<CustomerWithOrders> Customers { get; set; } = null!;
public OrderDbContext(DbContextOptions options) : base(options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<CustomerWithOrders>(c =>
{
c.OwnsMany(c => c.Orders);
c.ToCollection("customers");
});
}
}

CustomerWithOrders エンティティを保存すると、 MongoDB は次のJSONに示すように、Orders を埋め込みドキュメントの配列として保存します。

{
"_id": ObjectId("..."),
"Name": "Jane Smith",
"Orders": [
{ "Product": "Laptop", "Quantity": 1 },
{ "Product": "Mouse", "Quantity": 2 }
]
}

埋め込まれていないエンティティ間の関係をモデル化するには、あるドキュメントのIDを別のドキュメントのフィールドに保存することで、参照を手動で保存できます。このアプローチでは、アプリケーションコード内で関係を管理する必要があります。

次の例は、関連エンティティへの参照を保存する方法を示しています。

public class Author
{
public ObjectId Id { get; set; }
public string Name { get; set; } = null!;
}
public class Book
{
public ObjectId Id { get; set; }
public string Title { get; set; } = null!;
// Store reference to Author by storing the Author's Id
public ObjectId AuthorId { get; set; }
}

関連エンティティを検索するには、次の例に示すように、参照先のコレクションを個別にクエリする必要があります。

// Query a book and its author
var book = db.Books.FirstOrDefault(b => b.Title == "My Book");
var author = db.Authors.FirstOrDefault(a => a.Id == book!.AuthorId);

MongoDBでデータをモデリングする方法の詳細については、 MongoDB Serverドキュメントの データ モデリングを参照してください。

Entity Framework コアで所有されているエンティティタイプの詳細については、 Microsoft Entity Framework コア ドキュメントの「 所有されたエンティティタイプ 」を参照してください。

このガイドで説明されているメソッドとタイプの詳細については、次のMicrosoft APIドキュメントを参照してください。

戻る

トランザクション

項目一覧