MongoDB C#驱动程序和服务器生成的ObjectIds

时间:2014-07-13 14:55:35

标签: c# multithreading mongodb mongodb-.net-driver

有没有办法让服务器生成ObjectIds而不是C#Driver生成的ObjectIds?使用MongoCollectionSettings.AssignIdOnInsert = false只会将您归零ObjectIds。我在封顶集合上进行多线程插入,我看到线程在ObjectId生成和插入之间切换。这导致集合中的无序ObjectIds应该按照自然顺序对有序游标进行排序。现在我使用静态锁定对象进行插入,但不会对不同的可执行文件/服务器提供帮助。

pymongo驱动程序可能会出现这种情况:ObjectID generated by server on pymongo

1 个答案:

答案 0 :(得分:1)

从上限集合中按插入顺序获取文档

上限集合按插入顺序维护文档,因此理想情况下应使用natural order而不是依赖生成的_id中的时间戳。您的tailable游标将按自然顺序读取文档,因此不应基于_id进行任何假设。

生成服务器端_id

要使用C#驱动程序在服务器端生成_id,您需要:

  • 设置类属性[BsonIgnoreIfDefault]
  • 设置集合属性AssignIdOnInsert = false
  • 插入没有_id
  • 的文档

示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Bson.Serialization.Attributes;

public class MyDoc {
    [BsonIgnoreIfDefault]
    public ObjectId? Id;
    public int X;
}

public static class Program {
    public static void Main(string[] args) {
        MongoClient client = new MongoClient(); // connect to localhost
        var server = client.GetServer ();
        var database = server.GetDatabase("test");
        var collectionSettings = new MongoCollectionSettings { AssignIdOnInsert = false };
        var collection = database.GetCollection<MyDoc>("nullid", collectionSettings);

        // Insert document without _id
        collection.Insert(new MyDoc { X = 1});
    }
}