ドキュメントの配列を持つ単純なクラスがあります。C# オブジェクトとマッピングを以下に示します。
何らかの理由で、ユーザーを見つけたときに MongoDB ドライバーが埋め込まれたドキュメントのコレクションを返しません。AddToSet と Pull を使用してコレクションを編集できます。
Groups プロパティを明示的にマップする必要がある理由もよくわかりません。に電話すればうまくいくと思いましたcm.AutoMap()
。
ユーザーをロードするために使用しているコードは次のとおりです...
var collection = Database.GetCollection<User>(Constants.UsersCollectionName);
var builder = Builders<User>.Filter;
FilterDefinition<User> filter = builder.Eq(x => x.Id, UserId);
var result = await collection.Find(filter)
.ToListAsync();
return result;
グループ プロパティに明示的なインクルード プロジェクションを追加しようとしましたが、他のすべてのプロパティを削除しても空のコレクションが残るだけでした。
これがクラスです...
public class User
{
public User()
{
Groups = new HashSet<UserGroup>();
}
public string Id { get; set; }
public string Email { get; set; }
public IEnumerable<UserGroup> Groups { get; }
}
public class UserGroup
{
public string GroupId { get; set; }
public string TenantId { get; set; }
}
そしてマッピング…
BsonClassMap.RegisterClassMap<UserGroup>(cm =>
{
cm.AutoMap();
});
BsonClassMap.RegisterClassMap<User>(cm =>
{
cm.AutoMap();
cm.MapIdProperty(c => c.Id)
.SetIdGenerator(StringObjectIdGenerator.Instance)
.SetSerializer(new StringSerializer(BsonType.ObjectId));
cm.MapProperty(x => x.Groups);
});
そしてDBからのjson ...
{
"_id" : ObjectId("556717bb10e5c4a3f831dfca"),
"Email" : "test@test.com",
"Groups" : [
{
"GroupId" : "5641c6da134b9006dcdc0bff",
"TenantId" : "5567179f10e5c4a3f831dfc8"
}
]
}
編集:文字列のリストとして試してみましたが、まだ結果が返されません。明示的なマッピングも削除しましたが、例外がスローされています。
Element 'Groups' does not match any field or property of class AssetStream.Model.Admin.User.
ああ、パブリックセッターがいないからでしょうね。