初めてモンゴDBを使う


最近面接のために毎日出かけています.
👨 : 大人.MongoDBを書きますか?
👽 : ああ...いいえ...!
👨 : (なぜ来たのかと聞かれたように)?あ、それならMongoDBに質問しないでください.
後で...また私の貧富を見抜いたようだ.
それでは簡単にCRUDをしましょうか?そして複数のブログを閲覧し始めます.
  • MongoDBの概要、インストール、データモデリング
  • モンゴメリー+コーランを使用してCRUDを実施
  • MongoDB limit()、skip()メソッドを使用してページング
  • MongoDBアーキテクチャ設計:一対一の関係
  • かつてGopherだった私にとって一番役に立つのは2日、モンゴル+ゴランでCRUDを実現することです.もちろん特定の言語のそれがあまり好きではありません...有名な人に言われましたが、学部の時にC++をいくつか作りました...安全と同時にPythonも作られました今はGoを愛してもいいですか?(でもなぜJavaはこんなに感情がないのか)
    MongoDBのインストールから簡単なクエリーを行います.

    1.インストール


    公式サイトで取りなさい.インストールが非常に簡単リンクのダウンロード

    2.RDBMSとMongoDBの比較


    でも比較すると時間がかかるので短いです30秒未満
    RDBMSとMongDBは名前と形が少し違います

    NoSQLは通常、Key/Value形式の構造を有します.顔を見るとJSONを思い出す
    MongoDBも従来のNoSQLで、Key/Value形式のデータセットです.
    上記のDocumentは最終的に括弧で囲まれたKey/Valueです.
    			오 구조체처럼 생겼네

    RDBMS


    RDBMSでは、Tableは、横方向(ラベル)の縦方向(属性)を用いたデータのセットを有する.

    MongoDB


    しかし、MongoDBはこれらではなく、Key/Field形式のデータフォーマットをDocumentに統合します.複数のDocumentコレクションをCollectionと呼びます.

    形態の違いにメリットとデメリットはありますか?
    どうせMongoDBの文章でMongoDBの長所短所を見ると
  • 横方向拡張可能な分散システム
  • Schema-less
  • ACID
  • を緩和
  • Open Source
  • RDBMSは水平拡張も可能であるが、水平拡張をサポートするために作成されたものではないため、より不便である.でももう30秒も経っているので、これらを全部計算すると、データを格納してロードする形で終わる文章が長すぎると思いますので、ここで切ります.
    こちらのブログはよく書けています.残りはここで見よう(https://kciter.so/posts/about-mongodb)

    3. Code Implementation


    1.データベース接続


    まずDBに接続するMongoDBのデフォルトポートは27017です.次のように入力して接続してください.
    func ConnectDB() (client *mongo.Client, err error) {
    	clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
    	client, err = mongo.Connect(context.TODO(), clientOptions)
    	if err != nil {
    		return nil, err
    	}
    
    	err = client.Ping(context.TODO(), nil)
    	if err != nil {
    		return nil, err
    	}
    	return
    }
  • options.クライアント():クライアントに接続する情報を入力します.
  • mongo.Connect():Mongoサーバに接続してクライアントに戻ります.
  • client.Ping():接続が正常かどうかを確認します.
  • その後authのためにmongo serverにidとpwを作成しますが、現在はありません.

    2. Write Data


    さっきはキーバリューで保存すると言いましたが
    また、構造体に似ているという人もいます.
    structが作成され、Fieldのみが組み込まれている場合、Jsonパッケージを使用してmarshall、unmarshall、符号化、復号化できますか?こんな想いがあるんだ
    正しい.よかった.
    {
      uuid:"dbslqjtjfdbslzmdkdlepsxlvlzpdltusdlfksmsdltkdgksanswkduf"
      name:"damon"
      age:100
      address:"서울 어딘가"
    }
    このようなjsonファイルがあると言ってください.
    これを符号化するには、以下のような構造体を作成するだけでよい.
    type User struct{
    	UUID	string	`json:"uuid"`
    	Name 	string	`json:"name"`
    	Age 	int64	`json:"age"`
     	Address	string	`json:"address"`
    }
    いずれにしても、そのjsonファイルをmongodbに保存するなら!
    func Write(writeDB *mongo.Collection, docs User) {
    	// 대충 공공api 비스무리한거로 json파일 받아왔다는 가정 하에
    	err = json.NewDecoder(resp.Body).Decode(docs)
       
    	num, err := writeDB.CountDocuments(nil, bson.M{"uuid": docs[i].uuid})
    	if num > 0 {
    		continue
    	}
    
    	_, err = writeDB.InsertOne(context.TODO(), docs[i])
    	if err != nil {
    		return
    	}
    }
  • 型User struct:jsonkey/field同じ構造の構造体を作成します.
  • json.NewDecoder().Decode():jsonファイルを構造体にマッピングします.(デコード)
  • collection.CountDocuments():Collectionに重複するuuidがあるかどうかを確認します.
  • collection.InsertOne():CollectionにDocumentを追加します.
  • 書きやすいですよね?データを取り出すときも簡単です.

    3. Load Data

    func Load(col *mongo.Collection, page int64) (docs []User) {
    	findOptions := options.Find()
    	findOptions.SetSort(bson.D{{"created_at", -1}})
    	findOptions.SetLimit(20)
    	findOptions.SetSkip((page - 1) * 20)
    
    	res, err := col.Find(context.Background(), bson.D{}, findOptions)
    	if err != nil {
    		return
    	}
    
    	err = res.All(nil, &docs)
    	if err != nil {
    		return
    	}
    	return docs
    }
    取り出すだけでちょっと...ということで選択肢をくれました
  • SetSort():生成時間ソート(昇順、降順)
  • SetLimit():検索数はx個の
  • に制限されます.
  • SetSkip():どこから検索を開始するかを設定
    実際に探している時もあります.
  • collection.Find(オプション):検索データ
  • Find().ALL():復号
  • 上記のように探すことができます.正直Mongodbを初めて習った方も30分くらいで作れると思います

    しかし、なぜ私が宿題を提出するときにskipオプションを使わずに、すべてのデータを構造体に復号し、インデックスを行うのでしょうか.どうして出て30分後にすぐに思い出しますか?
    毎日布団を蹴るものを作ることができる私は本当に伝奇です...