4

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

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

4

3 回答 3

1

这是预期的行为。每个文档(不是子文档)都有一个 _id,如果为空则自动分配。

您要么需要单独的 Bars 集合并从 Foo 文档中引用它,要么手动生成 ObjectId。

如果你是从工厂 [或存储库] 做的,那么它会很可靠。

编辑:

此外,如果您使用

[BsonRepresentation(BsonType.ObjectId)]
string Id {get;set;}

这意味着您可以更轻松地访问 objectId 值,它仍然会保存在 ObjectId 中。

于 2013-02-04T00:23:07.130 回答
1

_id仅当字段被标识为集合时,驱动程序才会为您生成 Id 字段。在您的情况下,Bar嵌入在Foo文档中。

Bar因此,拥有一个自动生成的 Id 字段是没有意义的。

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

这绝对是预期的行为。

于 2013-02-04T20:25:04.497 回答
0

有一种常见的情况是更新或删除嵌入文档集合的一个元素。唯一的方法是依赖 id。

目前我已经构建了一个自定义的 IIdGenerator 并将其分配给 IdMemberMap,但它只被调用用于根文档。

有没有其他方法可以为嵌入文档生成自动 ID?

于 2014-11-25T09:59:32.327 回答