精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用過 Mongodb 吧, 這三個大坑踩過嗎?

開發 前端
mongodb自己組建了一個 number 組合的十六進制表示,姑且不說性能如何,反正看著不是很舒服,畢竟大家都習慣使用 int/long 類型展示的主鍵ID。

一:背景

1. 講故事

前段時間有位朋友在微信群問,在向 mongodb 中插入的時間為啥取出來的時候少了 8 個小時,8 在時間處理上是一個非常敏感的數字,又吉利又是一個普適的話題,后來我想想初次使用 mongodb 的朋友一定還會遇到各種新坑,比如說:插入的數據取不出來,看不爽的 ObjectID,時區不對等等,這篇就和大家一起聊一聊。

二:1號坑 插進去的數據取不出來

1. 案例展示

這個問題是使用強類型操作 mongodb 你一定會遇到的問題,案例代碼如下:

class Program
    {
        static void Main(string[] args)
        {
            var client = new MongoClient("mongodb://192.168.1.128:27017");
            var database = client.GetDatabase("school");
            var table = database.GetCollection<Student>("student");

            table.InsertOne(new Student() { StudentName = "hxc", Created = DateTime.Now });

            var query = table.AsQueryable().ToList();

        }
    }

    public class Student
    {
        public string StudentName { get; set; }

        public DateTime Created { get; set; }
    }

圖片圖片

我去,這么簡單的一個操作還報錯,要初學到放棄嗎?挺急的,在線等!

2. 堆棧中深挖源碼

作為一個碼農還得有鉆研代碼的能力,從錯誤信息中看說有一個 _id 不匹配 student 中的任何一個字段,然后把全部堆棧找出來。

System.FormatException
  HResult=0x80131537
  Message=Element '_id' does not match any field or property of class Newtonsoft.Test.Student.
  Source=MongoDB.Driver
  StackTrace:
   at MongoDB.Driver.Linq.MongoQueryProviderImpl`1.Execute(Expression expression)
   at MongoDB.Driver.Linq.MongoQueryableImpl`2.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Newtonsoft.Test.Program.Main(String[] args) in E:\crm\JsonNet\Newtonsoft.Test\Program.cs:line 32

接下來就用 dnspy 去定位一下 MongoQueryProviderImpl.Execute 到底干的啥,截圖如下:

圖片圖片

我去,這代碼硬核哈,用了 LambdaExpression 表達式樹,我們知道表達式樹用于將一個領域的查詢結構轉換為另一個領域的查詢結構,但要尋找如何構建這個方法體就比較耗時間了,接下來還是用 dnspy 去調試看看有沒有更深層次的堆棧。

圖片圖片

這個堆棧信息就非常清楚了,原來是在 MongoDB.Bson.Serialization.BsonClassMapSerializer.DeserializeClass 方法中出了問題,接下來找到問題代碼,簡化如下:

public TClass DeserializeClass(BsonDeserializationContext context){
    while (reader.ReadBsonType() != BsonType.EndOfDocument)
    {
        TrieNameDecoder<int> trieNameDecoder = new TrieNameDecoder<int>(elementTrie);
        string text = reader.ReadName(trieNameDecoder);
        if (trieNameDecoder.Found)
        {
            int value = trieNameDecoder.Value;
            BsonMemberMap bsonMemberMap = allMemberMaps[value];
        }
        else
        {
            if (!this._classMap.IgnoreExtraElements)
            {
                throw new FormatException(string.Format("Element '{0}' does not match any field or property of class {1}.", text, this._classMap.ClassType.FullName));
            }
            reader.SkipValue();
        }
    }
}

上面的代碼邏輯非常清楚,要么 student 中存在 _id 字段,也就是 trieNameDecoder.Found, 要么使用 忽略未知的元素,也就是 this._classMap.IgnoreExtraElements,添加字段容易,接下來看看怎么讓 IgnoreExtraElements = true,找了一圈源碼,發現這里是關鍵:

圖片圖片

也就是: foreach (IBsonClassMapAttribute bsonClassMapAttribute in classMap.ClassType.GetTypeInfo().GetCustomAttributes(false).OfType<IBsonClassMapAttribute>())這句話,這里的 classMap 就是 student,只有讓 foreach 得以執行才能有望 classMap.IgnoreExtraElements 賦值為 true ,接下來找找看在類上有沒有類似 IgnoreExtraElements 的 Attribute,嘿嘿,還真有一個類似的: BsonIgnoreExtraElements ,如下代碼:

[BsonIgnoreExtraElements]
    public class Student
    {
        public string StudentName { get; set; }

        public DateTime Created { get; set; }
    }

接下來執行一下代碼,可以看到問題搞定:

圖片圖片

如果你想驗證的話,可以繼續用 dnspy 去驗證一下源碼哈,如下代碼所示:

圖片圖片

接下來還有一種辦法就是增加 _id 字段,如果你不知道用什么類型接,那就用object就好啦,后續再改成真正的類型。

圖片圖片

三:2號坑 DateTime 時區不對

如果你細心的話,你會發現剛才案例中的 Created 時間是 2020/8/16 4:24:57, 大家請放心,我不會傻到凌晨4點還在寫代碼,好了哈,看看到底問題在哪吧, 可以先看看 mongodb 中的記錄數據,如下:

{
    "_id" : ObjectId("5f38b83e0351908eedac60c9"),
    "StudentName" : "hxc",
    "Created" : ISODate("2020-08-16T04:38:22.587Z")
}

從 ISODate 可以看出,這是格林威治時間,按照0時區存儲,所以這個問題轉成了如何在獲取數據的時候,自動將 ISO 時間轉成 Local 時間就可以了,如果你看過底層源碼,你會發現在 mongodb 中每個實體的每個類型都有一個專門的 XXXSerializer,如下圖:

圖片圖片

接下來就好好研讀一下里面的 Deserialize 方法即可,代碼精簡后如下:

public override DateTime Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args){
    IBsonReader bsonReader = context.Reader;
    BsonType currentBsonType = bsonReader.GetCurrentBsonType();
    DateTime value;

    switch (this._kind)
    {
        case DateTimeKind.Unspecified:
        case DateTimeKind.Local:
            value = DateTime.SpecifyKind(BsonUtils.ToLocalTime(value), this._kind);
            break;
        case DateTimeKind.Utc:
            value = BsonUtils.ToUniversalTime(value);
            break;
    }
    return value;
}

可以看出,如果當前的 this._kind= DateTimeKind.Local 的話,就將 UTC 時間轉成 Local 時間,如果你有上一個坑的經驗,你大概就知道應該也是用特性注入的,

[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime Created { get; set; }

不信的話,我調試給你看看哈。

圖片圖片

接下來再看看 this._kind 是怎么被賦的。

圖片圖片

圖片圖片

四:3號坑 自定義ObjectID

在第一個坑中,不知道大家看沒看到類似這樣的語句: ObjectId("5f38b83e0351908eedac60c9") ,乍一看像是一個 GUID,當然肯定不是,這是mongodb自己組建了一個 number 組合的十六進制表示,姑且不說性能如何,反正看著不是很舒服,畢竟大家都習慣使用 int/long 類型展示的主鍵ID。

那接下來的問題是:如何改成我自定義的 number ID 呢?當然可以,只要實現 IIdGenerator 接口即可,那主鍵ID的生成,我準備用 雪花算法,完整代碼如下:

class Program
    {
        static void Main(string[] args)
        {
            var client = new MongoClient("mongodb://192.168.1.128:27017");
            var database = client.GetDatabase("school");
            var table = database.GetCollection<Student>("student");

            table.InsertOne(new Student() { Created = DateTime.Now });
            table.InsertOne(new Student() { Created = DateTime.Now });
        }
    }

    class Student
    {
        [BsonId(IdGenerator = typeof(MyGenerator))]
        public long ID { get; set; }

        [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
        public DateTime Created { get; set; }
    }

    public class MyGenerator : IIdGenerator
    {
        private static readonly IdWorker worker = new IdWorker(1, 1);

        public object GenerateId(object container, object document)
        {
            return worker.NextId();
        }

        public bool IsEmpty(object id)
        {
            return id == null || Convert.ToInt64(id) == 0;
        }
    }

然后去看一下 mongodb 生成的 json:

圖片圖片

四:總結

好了,這三個坑,我想很多剛接觸 mongodb 的朋友是一定會遇到的困惑,總結一下方便后人乘涼,結果不重要,重要的還是探索問題的思路和不擇手段??????。

責任編輯:武曉燕 來源: 一線碼農聊技術
相關推薦

2024-09-24 13:31:33

2018-03-23 07:52:05

2025-03-25 10:35:37

OraclePython數據庫

2025-05-26 02:22:00

2025-01-16 16:16:53

2020-09-02 07:44:13

后端Long前端

2021-05-07 07:59:52

WebFluxSpring5系統

2019-08-12 11:18:12

機器學習數據集模型

2022-07-26 08:51:05

TryLockselectGo

2015-09-02 09:36:21

迅雷

2021-04-16 09:17:39

機器學習人工智能AI

2018-04-28 11:03:58

2017-11-02 13:15:18

Linux

2017-01-06 10:07:39

Linuxwindowsatime

2022-06-28 08:03:06

緩存Redis

2015-05-11 10:39:19

2020-03-27 10:20:05

安全眾測滲透測試網絡安全

2015-09-23 09:48:04

2022-03-30 14:19:36

云安全云計算風險

2021-10-15 08:32:03

RocketMQ數據結構架構
點贊
收藏

51CTO技術棧公眾號

日本aⅴ免费视频一区二区三区| 欧美久久综合网| 午夜影视日本亚洲欧洲精品| 日本一区二区三区视频免费看| 91麻豆国产在线| 欧美日韩a区| 一区二区三区视频免费在线观看| 无人码人妻一区二区三区免费| 操人在线观看| 亚洲欧美日韩国产成人精品影院 | 99久久人爽人人添人人澡| 好吊成人免视频| 日本三日本三级少妇三级66| 黄网在线观看| 不卡区在线中文字幕| 国产美女精品视频| 9i精品福利一区二区三区| 你懂的视频一区二区| 国产亚洲精品久久久久久| 国产综合内射日韩久| 欧美成人app| 粉嫩av一区二区三区免费野| 男人天堂成人网| 超碰国产在线| 久久综合色8888| 国产精品免费区二区三区观看| 在线观看中文字幕码| 亚洲女人av| 97香蕉久久超级碰碰高清版| 91免费在线看片| 国产欧美一区二区三区精品观看| 精品免费99久久| 97免费公开视频| 99精品美女视频在线观看热舞| 色噜噜偷拍精品综合在线| 欧美高清中文字幕| 三级网站视频在在线播放| 中文字幕日本乱码精品影院| 日韩欧美在线观看强乱免费| 美女毛片在线看| www久久精品| 久久国产精品久久精品国产| 狠狠躁日日躁夜夜躁av| 国产资源在线一区| 91久久久久久久久久久久久| 亚洲天堂一二三| 久久精品国产久精国产爱| 国产精品久久久久久久久免费看| www毛片com| 久久精品免费| 国产aⅴ夜夜欢一区二区三区| 国产精品老女人| 亚洲欧美日韩视频二区| 日本韩国欧美精品大片卡二| www.国产高清| 久久黄色网页| 国产精品亚洲综合天堂夜夜| 中文字幕 亚洲视频| 日韩av中文字幕一区二区| 国产精品久久久久av免费| 中文字幕乱码中文字幕| 另类的小说在线视频另类成人小视频在线| 国产精品日韩电影| 国产又粗又猛又黄| 国产一区在线视频| 国产伦精品一区二区三区视频黑人| 内射无码专区久久亚洲| 26uuu色噜噜精品一区二区| 欧美激情专区| 免费黄色网址在线观看| 亚洲午夜成aⅴ人片| 亚洲自偷自拍熟女另类| 超碰这里只有精品| 91麻豆精品91久久久久同性| 蜜臀aⅴ国产精品久久久国产老师| 在线精品国产亚洲| 亚洲视频专区在线| 国产极品美女在线| 亚洲精品综合| 国产精品爽爽爽爽爽爽在线观看| 国产精品久久久久久久久毛片 | 黄色成人91| 奇米4444一区二区三区| 在线观看中文字幕av| 国产成人免费在线| 清纯唯美一区二区三区| 国精产品一区| 精品久久久久久国产| 中文字幕在线观看第三页| 国产精品色婷婷在线观看| 亚洲国产一区自拍| 中文字幕在线观看2018| 99精品国产一区二区青青牛奶| 国产精品吹潮在线观看| 精品人妻无码一区二区三区蜜桃一 | 97免费在线视频| 这里只有精品免费视频| 国产成人精品免费| 日韩欧美亚洲区| 啊啊啊久久久| 欧美精品久久天天躁| 亚洲最大免费视频| 亚洲色图网站| 国产成人综合久久| 老司机午夜福利视频| 中文字幕av一区 二区| 国产特级淫片高清视频| av一级久久| 一区二区三欧美| 日产欧产va高清| 国产一区二区三区四| 欧美黄色直播| 激情aⅴ欧美一区二区欲海潮| 欧美精品一级二级| 欧美日韩中文字幕视频| 国产色综合网| 国产三区精品| 性xxxfreexxxx性欧美| 欧美日韩精品一区二区三区| aa片在线观看视频在线播放| 国内精品久久久久久久97牛牛 | 欧美第一黄网免费网站| 91精品国产乱码久久久久| 久久综合久久综合九色| av日韩一区二区三区| 美女精品久久| 日韩三级影视基地| 在线观看中文字幕av| 亚洲国产成人私人影院tom| 激情综合网婷婷| 欧美freesex8一10精品| 久久久久久国产免费| 国产欧美熟妇另类久久久| 国产精品伦一区| 婷婷丁香激情网| 国产影视一区| 国产精品观看在线亚洲人成网| 四虎影院在线播放| 亚洲成在线观看| 免费看91视频| 伊人成人在线| 国产在线一区二区三区播放| 国产深夜视频在线观看| 精品国产精品一区二区夜夜嗨| 欧美色图亚洲视频| 福利一区二区在线| 福利视频一区二区三区四区| 91综合精品国产丝袜长腿久久| 欧美二区在线播放| 黄色av网址在线| 婷婷一区二区三区| 国产艳俗歌舞表演hd| 久久成人亚洲| 日韩中文字幕一区二区| 久久亚洲国产精品尤物| 国产亚洲欧美日韩美女| 中国精品一区二区| 亚洲欧洲成人av每日更新| 17c国产在线| 欧美成人中文| 国产乱子伦精品| 欧美成人黑人| 中文字幕亚洲自拍| 97人妻精品一区二区三区视频| 亚洲视频一二三区| 日本wwwwwww| 久久激情网站| 国产人妻互换一区二区| 国产精品17p| 欧美专区中文字幕| a天堂中文在线| 日韩一区国产二区欧美三区| 久久久久香蕉视频| 久久久亚洲欧洲日产国码αv| 婷婷丁香激情网| 欧美性久久久| 欧美一区视久久| 欧美精品影院| 日本电影亚洲天堂| 成人片在线看| 亚洲精品久久久久中文字幕欢迎你| 久久久久久久久黄色| 亚洲色图一区二区三区| 熟妇无码乱子成人精品| 国产精品夜夜夜| 亚洲第一精品区| 日日天天久久| 91免费综合在线| 亚洲欧洲高清| 久久中国妇女中文字幕| 色就是色亚洲色图| 欧美一卡二卡三卡| 久久久久久久久久成人| 伊人婷婷欧美激情| 免费一级做a爰片久久毛片潮| 国产麻豆视频精品| 国产精品99久久免费黑人人妻| 中文字幕一区二区三区欧美日韩 | 欧美日韩亚州综合| 日本少妇裸体做爰| 日韩一区在线播放| 国产精品无码久久久久一区二区| 国产酒店精品激情| 亚州精品一二三区| 国产欧美成人| 黄色a级片免费看| 91亚洲成人| 欧美日韩在线精品| 国产一区二区三区亚洲| 成人在线观看视频网站| 日韩成人影音| 91高潮精品免费porn| 制服丝袜中文字幕在线| 色yeye香蕉凹凸一区二区av| 你懂的免费在线观看| 精品国产凹凸成av人导航| 97人妻精品一区二区三区软件| 日本二三区不卡| 国产精品自拍99| 性久久久久久久久| 九九九国产视频| 亚洲精品日韩综合观看成人91| 精品亚洲aⅴ无码一区二区三区| a亚洲天堂av| 国产精品成人免费一区久久羞羞| 国产一区二区在线观看免费| 国产精品久久久毛片| 日本欧美久久久久免费播放网| 夫妻免费无码v看片| 一本久道久久久| 男人的天堂狠狠干| 亚洲经典在线| 少妇人妻无码专区视频| 在线看片成人| 欧美 日韩 激情| 亚洲美女黄网| 91免费黄视频| 亚洲激情在线| 男人操女人免费软件| 国产精品久久久久久模特| 99视频在线免费播放| 宅男噜噜噜66国产日韩在线观看| 国产中文字幕在线免费观看| 中文国产一区| 99草草国产熟女视频在线| 久久久久久久欧美精品| 午夜免费高清视频| 精品一区二区在线看| 樱花草www在线| 国产91丝袜在线播放九色| 成人啪啪18免费游戏链接| 粉嫩嫩av羞羞动漫久久久| 色悠悠在线视频| 91免费小视频| 中文字幕有码在线播放| 国产精品福利在线播放| 国产黄色片在线免费观看| 亚洲第一精品在线| 国产视频1区2区| 欧美无砖专区一中文字| 国产又黄又大又粗的视频| 日韩一区二区精品葵司在线| 少妇人妻一区二区| 亚洲欧美日韩爽爽影院| 在线视频自拍| 欧美第一黄色网| 范冰冰一级做a爰片久久毛片| 国产精品av免费在线观看| 在线播放成人| 国产手机精品在线| av影片在线一区| 欧洲金发美女大战黑人| 亚洲美女啪啪| 亚洲18在线看污www麻豆| 黄色网址视频在线观看| 日韩高清欧美| 亚洲精品v日韩精品| 一本加勒比波多野结衣| 91视频www| av资源在线免费观看| 一区二区三区中文字幕| 国产精品男女视频| 欧美老女人在线| 亚洲三级中文字幕| 久久久国产精彩视频美女艺术照福利| 国产丝袜在线观看视频| 国产精品入口尤物| 91蝌蚪精品视频| 亚洲精品中文字幕乱码三区不卡| 欧美精品1区| 中文字幕永久视频| 国产91精品久久久久久久网曝门| 欧洲av一区二区三区| 樱花草国产18久久久久| 中国黄色一级视频| 日韩av在线一区| 二区三区在线观看| 日韩免费在线看| 中文字幕一区二区三区日韩精品| 日韩视频在线播放| 亚洲小说欧美另类社区| 天天操天天干天天做| 久久亚洲综合色一区二区三区| 破处女黄色一级片| 欧美视频三区在线播放| 天堂在线观看av| 欧美成人免费在线观看| 欧美性片在线观看| 精品在线视频一区二区| 亚洲精品久久久| 四季av一区二区| 337p粉嫩大胆色噜噜噜噜亚洲| 久久精品一级片| 欧美精选午夜久久久乱码6080| 国产在线观看免费| 69久久夜色精品国产69乱青草| 日本精品在线播放 | 日韩精品免费一区二区三区| 玩弄中年熟妇正在播放| 国产高清亚洲一区| 五月天色婷婷丁香| 欧美日韩精品一区二区三区四区| 国产亚洲依依| 日本欧美在线视频| 亚洲激情77| 黄页网站大全在线观看| 成人天堂资源www在线| 欧美日韩三级在线观看| 884aa四虎影成人精品一区| 2021av在线| 国产精品电影一区| 欧美理论电影大全| 91制片厂毛片| 国产精品美女一区二区在线观看| 国产又粗又猛又黄视频| 国产一区二区三区在线观看视频 | 91超碰在线免费观看| 国产精品成人a在线观看| 亚洲久久中文字幕| 国产精品成人网| 国产一区二区视频免费观看| 日韩在线国产精品| 欧美在线一级| 国产女人18毛片| 国产二区国产一区在线观看| 美女毛片在线观看| 精品乱人伦一区二区三区| 国产美女一区视频| 国产三区二区一区久久| 久久黄色网页| 妖精视频在线观看免费| 欧美人与禽zozo性伦| 成人在线网址| 国产成人女人毛片视频在线| 99精品视频网| 国产成人av一区二区三区不卡| 色久优优欧美色久优优| 亚洲欧美视频一区二区| 亚洲aⅴ男人的天堂在线观看 | 国产成人ay| 男操女免费网站| 亚洲三级免费电影| 全国男人的天堂网| 国产精品www色诱视频| 久久亚洲成人| 美国黄色一级视频| 一本色道综合亚洲| 在线免费观看黄| yellow视频在线观看一区二区| 日韩视频一区| 精品在线观看一区| 精品国产一区二区三区忘忧草| 小早川怜子影音先锋在线观看| 天堂精品视频| 粉嫩aⅴ一区二区三区四区| 日本天堂网在线| 日韩亚洲欧美中文在线| 伊人久久影院| 老司机午夜av| 一区二区三区久久久| 免费国产在线观看| 91免费版黄色| 乱人伦精品视频在线观看| 成年人免费视频播放| 亚洲国产精品久久久久| 69堂精品视频在线播放| 欧美h视频在线观看| 99riav久久精品riav| 91久久久久久久久久久久| 91国产在线精品| 91精品国产调教在线观看| theav精尽人亡av| 日韩一级片网站| 电影亚洲精品噜噜在线观看| 青草网在线观看| 国产精品久久久久久久久快鸭| 姝姝窝人体www聚色窝| 成人在线视频网| 久久久久免费| 精品午夜福利视频|