当我有一个包含文档列表的根文档并且我保存/插入时,根文档总是从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对象.
这绝对是预期的行为.