嵌入式MongoDB文档在使用C#驱动程序保存时未获取ID

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

有工厂:

public class Factory
{
    public Foo CreateFoo(string name)
    {
        return new Foo {
            Id = new ObjectId(),
            Name = name,
            Bars = new List<Bar>()
        };
    }

    public Bar CreateBar(string name)
    {
        return new Bar {
            Id = new ObjectId(),
            Name = name
        };
    }
}

当我运行这样的示例时:

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

foo1和foo2都得到了由MongoDB生成的_id,但是没有一个得到.所有的Bars仍然有ObjectId.Empty.现在一个简单的解决方案是更新工厂以使用ObjectId.GenerateNewId(),但我觉得从数据库生成它更舒服.有没有人对此有任何见解?难道我做错了什么?这甚至可能吗?感谢您的投入.

最佳答案 当字段被标识为集合的_id时,驱动程序将仅为您生成Id字段.在您的情况下,Bar嵌入在Foo文档中.

因此,Bar具有自动生成的Id字段是没有意义的.

在您的示例中,Bar实际上没有理由拥有唯一的_id.当您查询集合时,您将基于Foo的_id进行查询,并且您将在响应中使用Bar对象.

这绝对是预期的行为.

点赞