【问题标题】:MongoDB C# Driver and server generated ObjectIdsMongoDB C# 驱动程序和服务器生成的 ObjectId
【发布时间】:2014-07-14 08:38:06
【问题描述】:

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

使用 pymongo 驱动程序似乎可以做到这一点:ObjectID generated by server on pymongo

【问题讨论】:

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


    【解决方案1】:

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

    上限集合按插入顺序维护文档,因此您最好使用natural order,而不是依赖生成的_id 中的时间戳。您的可拖尾光标将按自然顺序阅读文档,因此不应基于 _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});
        }
    }
    

    【讨论】:

    • 如果我只使用自然顺序并且我的游标因任何原因而死,我将如何制定查询来重新创建游标?如果我使用大于上次检索的 ObjectId,我可以获得我已经处理过的项目。有什么方法可以查询大于 ObjectId 的自然顺序?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    相关资源
    最近更新 更多