- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
C#编程指南MongoDB中的主键ObjectId
前言
因为很多场景下我们需要在创建MongoDB数据的时候提前生成好主键,像在EF中我们可以通过Guid.NewGuid()来生成主键,本来想着要不要实现一套MongoDB中ObjectId的,结果发现网上各种各样的实现都有,不过好在阅读C#MongoDB驱动mongo-csharp-driver代码的时候发现有ObjectId.GenerateNewId()的方法提供,我们可以直接调用即可,不需要我们在花费多余的时间设计重写了。
MongoDBObjectId类型概述
每次插入一条数据系统都会自动插入一个_id键,键值不可以重复,它可以是任何类型的,也可以手动的插入,默认情况下它的数据类型是ObjectId,由于MongoDB在设计之初就是用作分布式数据库,所以使用ObjectId可以避免不同数据库中_id的重复(如果使用自增的方式在分布式系统中就会出现重复的_id的值)。ObjectId使用12字节的存储空间,每个字节可以存储两个十六进制数字,所以一共可以存储24个十六进制数字组成的字符串,在这24个字符串中,前8位表示时间戳,接下来6位是一个机器码,接下来4位表示进程id,最后6位表示计数器。
MongoDB采用ObjectId来表示主键的类型,数据库中每个文档都拥有一个_id字段表示主键,_id的生成规则如下:
其中包括:4-byteUnix时间戳,3-byte机器ID,2-byte进程ID,3-byte计数器(初始化随机)。
601e2b6b??a3203c??c89f???2d31aa
???↑????????↑???????↑???????↑
?时间戳????机器码???进程ID???随机数
MongoDB.Driver驱动安装
1、直接命令自动安装
Install-Package?MongoDB.Driver
2、搜索Nuget手动安装
调用生成主键ObjectId
inivar?primarykeyId?=?ObjectId.GenerateNewId();
//输出:641c54b2e674000035001dc2
mongo-csharp-driverObjectId源码详解
/*?Copyright?2010-present?MongoDB?Inc.
*
*?Licensed?under?the?Apache?License,?Version?2.0?(the?License);
*?you?may?not?use?this?file?except?in?compliance?with?the?License.
*?You?may?obtain?a?copy?of?the?License?at
*
*?/licenses/LICENSE-2.0
*
*?Unless?required?by?applicable?law?or?agreed?to?in?writing,?software
*?distributed?under?the?License?is?distributed?on?an?AS?IS?BASIS,
*?WITHOUT?WARRANTIES?OR?CONDITIONS?OF?ANY?KIND,?either?express?or?implied.
*?See?the?License?for?the?specific?language?governing?permissions?and
*?limitations?under?the?License.
*/
using?System;
using?System.Diagnostics;
using?System.Runtime.CompilerServices;
using?System.Security;
using?System.Threading;
namespace?MongoDB.Bson
{
????///?summary
????///?Represents?an?ObjectId?(see?also?BsonObjectId).
????///?/summary
#if?NET45
????[Serializable]
#endif
????public?struct?ObjectId?:?IComparableObjectId,?IEquatableObjectId,?IConvertible
????{
????????//?private?static?fields
????????private?static?readonly?ObjectId?__emptyInstance?=?default(ObjectId);
????????
文档评论(0)