sql >> データベース >  >> NoSQL >> MongoDB

マングーススキーマがネストされたドキュメントにタイムスタンプを設定

    マングーススキーマのタイムスタンプオプションを内部スキーマに適用することもできます。

    たとえば、次のスキーマでは、timestamps: trueを適用しました。 内部入札スキーマのオプション。

    const mongoose = require("mongoose");
    
    const forumSchema = new mongoose.Schema(
      {
        title: { type: String, required: true },
        biddings: [
          {
            type: new mongoose.Schema(
              {
                biddingId: String,
                biddingPoints: Number
              },
              { timestamps: true }
            )
          }
        ]
      },
      { timestamps: true }
    );
    
    const Forum = mongoose.model("Forum", forumSchema);
    
    module.exports = Forum;
    

    それではテストしてみましょう:

    次のコードでフォーラムドキュメントを作成しました:

    const Forum = require("../models/forum");
    
    router.post("/forums", async (req, res) => {
      const result = await Forum.create(req.body);
      res.send(result);
    });
    

    リクエスト本文:

    {
        "title": "Title 1",
        "biddings": [
            {
                "biddingId": "bidding1",
                "biddingPoints": 10
            },
            {
                "biddingId": "bidding2",
                "biddingPoints": 30
            }
        ]
    }
    

    応答:(タイムスタンプは親ドキュメントとサブドキュメントの両方に適用されます)

    {
        "_id": "5e3073b3a2890b03b029e92c",
        "title": "Title 1",
        "biddings": [
            {
                "_id": "5e3073b3a2890b03b029e92e",
                "biddingId": "bidding1",
                "biddingPoints": 10,
                "createdAt": "2020-01-28T17:47:31.376Z",
                "updatedAt": "2020-01-28T17:47:31.376Z"
            },
            {
                "_id": "5e3073b3a2890b03b029e92d",
                "biddingId": "bidding2",
                "biddingPoints": 30,
                "createdAt": "2020-01-28T17:47:31.376Z",
                "updatedAt": "2020-01-28T17:47:31.376Z"
            }
        ],
        "createdAt": "2020-01-28T17:47:31.376Z",
        "updatedAt": "2020-01-28T17:47:31.376Z",
        "__v": 0
    }
    

    次に、入札ポイントを_id:5e3073b3a2890b03b029e92eで更新しましょう。

    router.put("/forums/:forumId/biddings/:biddingId",
      async (req, res) => {
        let points = req.body.points;
    
        try {
          let result = await Forum.findByIdAndUpdate(
            req.params.forumId,
            {
              $set: {
                "biddings.$[inner].biddingPoints": points
              }
            },
            {
              arrayFilters: [{ "inner._id": req.params.biddingId }],
              new: true
            }
          );
    
          if (!result) return res.status(404);
    
          res.send(result);
        } catch (err) {
          console.log(err);
          res.status(500).send("Something went wrong");
        }
      }
    );
    

    URLは次のようになります:http://.../forums/5e3073b3a2890b03b029e92c/biddings/5e3073b3a2890b03b029e92e

    リクエスト:(これは、ポイントを_id:5e3073b3a2890b03b029e92eで入札の50に更新することを意味します :

    {
        "points": 50
    }
    

    応答:(updatedAtが表示されているように 更新された入札のフィールド値が2020-01-28T17:47:31.376Zから自動的に変更されました 2020-01-28T17:50:03.855Zへ )

    {
        "_id": "5e3073b3a2890b03b029e92c",
        "title": "Title 1",
        "biddings": [
            {
                "_id": "5e3073b3a2890b03b029e92e",
                "biddingId": "bidding1",
                "biddingPoints": 50,
                "createdAt": "2020-01-28T17:47:31.376Z",
                "updatedAt": "2020-01-28T17:50:03.855Z"   ==> UPDATED
            },
            {
                "_id": "5e3073b3a2890b03b029e92d",
                "biddingId": "bidding2",
                "biddingPoints": 30,
                "createdAt": "2020-01-28T17:47:31.376Z",
                "updatedAt": "2020-01-28T17:47:31.376Z"
            }
        ],
        "createdAt": "2020-01-28T17:47:31.376Z",
        "updatedAt": "2020-01-28T17:50:03.855Z",
        "__v": 0
    }
    



    1. Mongodb、datediffによるグループ化と時間の取得

    2. Robomongo:$groupのメモリ制限を超えました

    3. ruby Digest ::SHA1インスタンスオブジェクトをシリアル化できますか?

    4. ノードバックエンドに画像を保存する方法は?