嵌入式MongoDB文档在使用C#驱动程序保存时未获取ID
当我有一个包含文档列表的根文档并保存/插入时,根文档总是从MongoDB获取ID,但列表中的文档没有,它们与嵌入式MongoDB文档在使用C#驱动程序保存时未获取ID,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,当我有一个包含文档列表的根文档并保存/插入时,根文档总是从MongoDB获取ID,但列表中的文档没有,它们与ObjectId.Empty保持相同。我不确定我是做错了什么,还是这是故意的行为 下面是我尝试做的一个例子: 鉴于课程: public class Foo { public ObjectId Id { get; set; } public string Name { get; set; } public IList<Bar> Bars { get; se
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; }
}
MongoDB生成了
foo1
和foo2
获取\u id
,但是条都没有。所有的条
仍然有ObjectId.Empty
。现在,一个简单的解决方案是将工厂更新为使用ObjectId.GenerateNewId()
,但是从DB生成它会让我感觉更舒服。有人对此有什么见解吗?我做错什么了吗?这可能吗?感谢您的输入。这是您的预期行为。每个文档(不是子文档)都有一个_id,如果为空,则会自动分配该id
您或者需要有一个单独的条集合并从Foo文档中引用它,或者手动生成objectid
如果您是在工厂(或存储库)中进行的,那么它将是可靠的
编辑:
此外,如果您使用
[BsonRepresentation(BsonType.ObjectId)]
string Id {get;set;}
这意味着您可以更轻松地访问objectId值,它仍将保存为objectId。当字段被标识为集合的\u Id
时,驱动程序将仅为您生成Id字段。在您的例子中,Bar
嵌入在Foo
文档中
因此,Bar
自动生成Id字段是没有意义的
在您的示例中,Bar
确实没有理由拥有唯一的\u id
。当您查询集合时,您将根据Foo
的\u id
进行查询,并且响应中将包含Bar
对象
这绝对是预期的行为。有一种常见的情况是更新或删除嵌入文档集合的一个元素。唯一的方法是依靠id
目前,我已经构建了一个定制的IIdGenerator,并将其分配给IdMemberMap,但它只被根文档调用
是否有其他方法为嵌入的文档生成自动ID 如果我需要删除某个项目,我应该如何操作?
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);
}
}
[BsonRepresentation(BsonType.ObjectId)]
string Id {get;set;}