MongoDB:自动生成的 ID 为零
Posted
技术标签:
【中文标题】MongoDB:自动生成的 ID 为零【英文标题】:MongoDB: automatically generated IDs are zeroes 【发布时间】:2011-06-03 09:59:45 【问题描述】:我正在使用 MongoDB 和官方 C# 驱动程序 0.9
我只是在检查嵌入简单文档的工作原理。
有 2 个简单的课程:
public class User
public ObjectId _id get; set;
public string Name get; set;
public IEnumerable<Address> Addresses get;set;
public class Address
public ObjectId _id get; set;
public string Street get; set;
public string House get; set;
我创建了一个新用户:
var user = new User
Name = "Sam",
Addresses = (new Address[] new Address House = "BIGHOUSE", Street = "BIGSTREET" )
;
collection.Insert(user.ToBsonDocument());
用户已成功保存,他的地址也已成功保存。
输入后
db.users.find()
在 MongoDB shell 中,我得到了以下结果:
"_id" : ObjectId("4e572f2a3a6c471d3868b81d"), "Name" : "Sam", "Addresses" : [
"_id" : ObjectId("000000000000000000000000"),
"Street" : "BIGSTREET",
"House" : "BIGHOUSE"
]
为什么地址的对象 id 为 0?
使用地址进行查询虽然有效:
collection.FindOne(Query.EQ("Addresses.Street", streetName));
它返回用户“Sam”。
【问题讨论】:
我做一个假设:如果您插入另一行,并且您检索新行,则 id 仍然是 000000000000 @Octopus-Paul,是的,没错。 【参考方案1】:与其说是错误,不如说是未达到预期。只有*** _id 会自动分配一个值。任何嵌入的 _id 都应由客户端代码分配值(使用 ObjectId.GenerateNewId)。也有可能您甚至不需要 Address 类中的 ObjectId(它的目的是什么?)。
【讨论】:
哦,我一直认为 ObjectIds 对所有文档都是强制性的。如果没有 id 这一切都可以,那就太好了。我不会称其为未达到预期,因为例如,Ruby 驱动程序会为嵌入式文档创建 ID。 这是否记录在某处?我没有看到任何提及它。自动分配根而不是嵌入文档(我认为它们都是“文档”)背后的基本原理是什么? 另外,以这种方式使用 Comb GUID 生成器的任何方式? @UpTheCreek,只有根文档在集合的默认索引中被索引,因此只有根文档需要唯一的 id。 不要总是认为 ObjectID 只是一个遗留 ID。它是一个复杂的类型,它还具有 Timestamp、CreationDate 和其他一些有价值的属性。所以开发者在使用它时可能有一些“侧面”目的。【参考方案2】:使用 BsonId 属性:
public class Address
[BsonId]
public string _id get; set;
public string Street get; set;
public string House get; set;
标识 Id 字段或属性
识别哪个字段或属性 一个类是你可以写的Id:
public class MyClass [BsonId] public string SomeProperty get; set;
Driver Tutorial
编辑
它实际上不起作用。我稍后会检查原因。 如果你需要得到它的工作使用以下:
[Test]
public void Test()
var collection = Read.Database.GetCollection("test");
var user = new User
Name = "Sam",
Addresses = (new Address[] new Address House = "BIGHOUSE", Street = "BIGSTREET", _id = ObjectId.GenerateNewId().ToString() )
;
collection.Insert(user.ToBsonDocument());
【讨论】:
好的,我提交了。感谢 ObjectId.GenerateNewId() 的解决方案,我将它放在所有 Document 类的构造函数中,它现在可以工作了。 还有属性[BsonId(IdGenerator = typeof(ObjectIdGenerator))] 支持 ObjectId.GenerateNewId().ToString();谢谢!【参考方案3】:以用户类型获取集合:
var collection = db.GetCollection<User>("users");
初始化字段_id如下:
var user = new User
_id = ObjectId.Empty,
Name = "Sam",
Addresses = (new Address[] new Address House = "BIGHOUSE", Street = "BIGSTREET" )
;
然后你插入对象:
collection.InsertOne(user);
_id 字段会自动生成。
在此link 中,您将找到其他方法来自定义自动生成的 ID。
【讨论】:
试过这个,但它也不起作用。总是得到零。还尝试将此与上述其他建议结合起来。以上是关于MongoDB:自动生成的 ID 为零的主要内容,如果未能解决你的问题,请参考以下文章