嵌入式MongoDB文档在使用C#驱动程序保存时未获取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

当我有一个包含文档列表的根文档并保存/插入时,根文档总是从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; }
}

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;}