我正在try 使用.网络驱动程序.它似乎不会自动生成_id-on-upserts,尽管它确实正确地生成了_id-on-plain insert.如何使驱动程序正确生成_id

下面是一个小例子来说明这个问题.

public class MongoObject
{
    [BsonId(IdGenerator = typeof(StringObjectIdGenerator))]
    [BsonRepresentation(BsonType.ObjectId)]
    public string MongoID { get; set; }

    public int Index { get; set; }
}

var obj = new MongoObject()
{
    Index = 1
};

//This inserts the document, but with a _id set to Null
_collection.Update(Query.EQ("Index", BsonValue.Create(1)), Update.Replace(obj), UpdateFlags.Upsert, new WriteConcern() { Journal = true });

//This inserts the document with the expected autogenerated _id
//_collection.Insert(obj);

推荐答案

当然,我会在发帖后立即找到答案.从this answer开始,解决方案是向ID添加[BsonIgnoreIfDefault]属性.在问题的示例中,它是:

public class MongoObject
{
    [BsonId(IdGenerator = typeof(StringObjectIdGenerator))]
    [BsonRepresentation(BsonType.ObjectId)]
    [BsonIgnoreIfDefault]    // <--- this is what was missing
    public string MongoID { get; set; }

    public int Index { get; set; }
}

Mongodb相关问答推荐

在Mongoose中对嵌套文档设置时间戳,但不对父文档设置时间戳

Mongoose 查询以获取内部数组和该内部数组中的特定元素

Mongo聚合的具体格式

如何判断 MongoDB 的两个数组中是否存在值?

使用 mongo-driver/mongo 使用键/值对中的值表达式查找文档

通过insertId MongoDB获取文档

如何过滤查找mongodb的结果

映射数组导致 mongodb 聚合

如何在 2 个应用程序之间共享mongoose模型?

使用 homebrew 和 Xcode 8.1.1 安装 Mongodb 失败

Mongodb将重音字符匹配为基础字符

MongoDB:设置 Windows 服务

为 php 5.6 (XAMPP) 添加 mongodb 扩展

MongoDB GridFS VS 直接磁盘 IO

使用 Jackson 与 Java Mongo DBObject 进行高效 POJO 映射

移动 MongoDB 的数据文件夹?

了解 Mongoose 中的关系和外键

从 mongo 结果中删除 _id

无法在 mac os 10.9 上安装 mongodb php 驱动程序

mongoose查询返回 null