问题描述
我有一个如下所示的架构:
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 模式在嵌套文档上设置时间戳的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!