Mongoose 模式在嵌套文档上设置时间戳 [英] Mongoose schema set timestamp on nested document

查看:34
本文介绍了Mongoose 模式在嵌套文档上设置时间戳的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个如下所示的架构:

I have a schema that looks as follows:

{
  "_id": "5073c76a23ce3abf0f000001",
  "asker": {
    "userId": "fooId",
    "firstName": "foo",
    "lastName": "bar",
    "points": "10",
    "aboutMe": "Something about me"
  },
  "isBounty": false,
  "tags": ["mongodb", "nosql", "mongodb-query"],
  "title": "Is there merit to adding flat properties additional to a duplicate nested",
  "descriptionMd": "Question description",
  "offeredPoints": 10,
  "slug": "is-there-merit-to-adding-flat-properties-additional-to-a-duplicate-nested",
  "biddings": [{
    "biddingId": "_biddingId",
    "respondent": {
      "userId": "fooId",
      "firstName": "foo",
      "lastName": "bar",
      "points": "10",
      "aboutMe": "Something about me"
    },
    "biddingPoints": 10,
    "createdAt": "2019-03-21T08:00:00",
    "lastUpdatedAt": "2019-03-21T08:00:00"
  }],
  "acceptedBidding": "_biddingId",
  "answers": [
    {
      "respondent": {
        "address": {
          "userId": "fooId",
          "firstName": "foo",
          "lastName": "bar",
          "points": "10",
          "aboutMe": "Something about me"
        }
      },
      "answerTextMd": "Answer 1",
      "reviewRequested": true,
      "reviewer": {
        "userId": "fooId",
        "firstName": "foo",
        "lastName": "bar",
        "points": "10",
        "aboutMe": "Something about me"
      },
      "reviewStatus": "ANSWER_ACCEPTED",
      "createdAt": "2019-03-21T08:00:00",
      "lastUpdatedAt": "2019-03-21T08:00:00"
    }
  ],
  "createdAt": "2019-03-21T08:00:00",
  "lastUpdatedAt": "2019-03-21T08:00:00"
}

此架构适用于问答论坛,我更喜欢将所有数据嵌入问题文档中.

This schema is meant for a Q&A forum and I prefer to keep all data embedded in the question document.

要求如下:

  • 在问题文档中设置创建和更新的时间戳
  • 时间戳也应该放在嵌套的出价和答案上

我知道在问题文档上放置时间戳的默认方式:

I know the default way to put a timestamp on the Question document:

const mySchema = new mongoose.Schema( {name: String}, {timestamps: true} );

如何在更新时将时间戳动态放置在嵌套文档上?
是否有建议的做法,还是我应该自己将字段放在那里并手动更新它们?

How do I put the timestamp dynamically on the nested documents on update?
Is there an advised way of doing, or should I just put the fields there myself and update them manually?

推荐答案

您还可以将 mongoose 模式时间戳选项应用于内部模式.

You can also apply mongoose schema timestamps options to the inner schemas.

例如,在以下架构中,我将 timestamps: true 选项应用于内部出价架构.

For example in the following schema, I applied timestamps: true option to the inner biddings schema.

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;

现在让我们测试一下:

我使用以下代码创建了一个论坛文档:

I created a forum document with the following code:

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
        }
    ]
}

响应:(如您所见,时间戳同时应用于父文档和子文档)

Response: (as you see timestamps are both applied to the parent and sub documents)

{
    "_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");
    }
  }
);

网址如下:http://.../forums/5e3073b3a2890b03b029e92c/biddings/5e3073b3a2890b03b029e92e

请求:(这意味着我想用 _id:5e3073b3a2890b03b029e92e 更新投标的 50 点:

Request: (it means I want to update the points to 50 of the bidding with _id:5e3073b3a2890b03b029e92e:

{
    "points": 50
}

响应:(如您所见,更新出价的 updatedAt 字段值自动从 2020-01-28T17:47:31.376Z 更改为 2020-01-28T17:50:03.855Z )

Response: (as you see updatedAt field value of the updated bidding changed automatically from 2020-01-28T17:47:31.376Z to 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
}

这篇关于Mongoose 模式在嵌套文档上设置时间戳的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆