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 为零的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 插入之后怎样获取id

具有自动增量的 mongodb 第二个 id 字段

MongoDB 自动增长

Mongodb生成ID包含单词“bad”

Mongodb生成ID包含单词“bad”

春季数据MongoDB。生成id的错误