无法更新 mongoose 中的 createdAt 属性?
unable to update the createdAt property in mongoose?
大家好,
问题可能看起来重复,但我的业务案例略有不同,请耐心等待。
我正在使用其他开发人员定义的旧模式,其中缺少 createdAt
和 updatedAt
属性。所以我通过添加 { timestamps: true }
更新了模式。每当我创建新文档时都没有问题。它按预期工作但 existing/old 文档在那里所以我试图通过编写单独的脚本并从 _id
属性 读取创建时间来添加 createdAt
属性,例如 _id.getTimestamp()
.我能够从 _id 中提取创建时间,但无法在现有文档中添加 createdAt
属性。旧 documents/data 非常重要,但企业希望将 createdAt
属性 添加到旧文档。
我正在使用 mongoose NPM 库,版本是:"mongoose": "^5.9.16",
架构示例如下:
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const profileSchema = new Schema(
{
name: {
type: String,
required: true
},
profile_number: {
type: Number
},
view: {
type: String
},
},
{ timestamps: true }
);
module.exports = mongoose.model("profile", profileSchema, "profile");
脚本添加 createdAt 属性 从 _id
中提取时间戳
const mongoose = require("mongoose");
const Profile= require("../../models/Profile/ProfileModel");
/****
* * Fetch all Portfolios List
* */
exports.getAllProfileList = async (req, res, next) => {
try {
const profileResult = await Profile.find({},{_id:1}).exec(); //return all ids
const timeStampExtract = await profileResult.map(item => {
console.log("Item is:", item._id.getTimestamp());
// trying to update createdAt time by extacting item._id.getTimestamp()
Profile.findOneAndUpdate(
{ _id: item._id },
{ $set: { createdAt: item._id.getTimestamp() } },
{ upsert: true }
)
.then(res => console.log("Response:"))
.catch(error => console.log("Error is:", error.message));
return item._id.getTimestamp();
});
if (!profileResult ) {
return res
.status(400)
.json({ message: "Unable to find profile list", statusCode: 400 });
}
res
.status(200)
.json({ totalCount: profileResult.length, data: timeStampExtract });
} catch (error) {
logger.error(error.message);
return res.status(500).json({ message: error.message, statusCode: 500 });
}
};
默认情况下 createdAt 是不可变的?
有人可以帮忙吗?会有很大的帮助。
感谢所有专家
由于某些文档是在 timestamps
选项设置为 false(这是默认值)时创建的,因此 mongoose 不会知道这些时间戳。因此,item._id.getTimestamp()
将 return 未定义。
您可以做的是重新创建 createdAt
不存在的条目。如果启用该选项,Mongoose 将自动生成时间戳并将它们设置为当前时间戳:
const profilesWithoutCreated = await Profile.find({createdAt: {$exists: false}}).exec();
const timeStampExtract = [];
let newProfile;
for (const profile of profiles) {
newProfile = new Profile(profile);
newProfile.createdAt = profile._id.getTimestamp();
const savedProfile = await newProfile.save();
timeStampExtract.push(savedProfile._id.getTimestamp());
}
大家好,
问题可能看起来重复,但我的业务案例略有不同,请耐心等待。
我正在使用其他开发人员定义的旧模式,其中缺少 createdAt
和 updatedAt
属性。所以我通过添加 { timestamps: true }
更新了模式。每当我创建新文档时都没有问题。它按预期工作但 existing/old 文档在那里所以我试图通过编写单独的脚本并从 _id
属性 读取创建时间来添加 createdAt
属性,例如 _id.getTimestamp()
.我能够从 _id 中提取创建时间,但无法在现有文档中添加 createdAt
属性。旧 documents/data 非常重要,但企业希望将 createdAt
属性 添加到旧文档。
我正在使用 mongoose NPM 库,版本是:"mongoose": "^5.9.16",
架构示例如下:
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const profileSchema = new Schema(
{
name: {
type: String,
required: true
},
profile_number: {
type: Number
},
view: {
type: String
},
},
{ timestamps: true }
);
module.exports = mongoose.model("profile", profileSchema, "profile");
脚本添加 createdAt 属性 从 _id
中提取时间戳 const mongoose = require("mongoose");
const Profile= require("../../models/Profile/ProfileModel");
/****
* * Fetch all Portfolios List
* */
exports.getAllProfileList = async (req, res, next) => {
try {
const profileResult = await Profile.find({},{_id:1}).exec(); //return all ids
const timeStampExtract = await profileResult.map(item => {
console.log("Item is:", item._id.getTimestamp());
// trying to update createdAt time by extacting item._id.getTimestamp()
Profile.findOneAndUpdate(
{ _id: item._id },
{ $set: { createdAt: item._id.getTimestamp() } },
{ upsert: true }
)
.then(res => console.log("Response:"))
.catch(error => console.log("Error is:", error.message));
return item._id.getTimestamp();
});
if (!profileResult ) {
return res
.status(400)
.json({ message: "Unable to find profile list", statusCode: 400 });
}
res
.status(200)
.json({ totalCount: profileResult.length, data: timeStampExtract });
} catch (error) {
logger.error(error.message);
return res.status(500).json({ message: error.message, statusCode: 500 });
}
};
默认情况下 createdAt 是不可变的?
有人可以帮忙吗?会有很大的帮助。
感谢所有专家
由于某些文档是在 timestamps
选项设置为 false(这是默认值)时创建的,因此 mongoose 不会知道这些时间戳。因此,item._id.getTimestamp()
将 return 未定义。
您可以做的是重新创建 createdAt
不存在的条目。如果启用该选项,Mongoose 将自动生成时间戳并将它们设置为当前时间戳:
const profilesWithoutCreated = await Profile.find({createdAt: {$exists: false}}).exec();
const timeStampExtract = [];
let newProfile;
for (const profile of profiles) {
newProfile = new Profile(profile);
newProfile.createdAt = profile._id.getTimestamp();
const savedProfile = await newProfile.save();
timeStampExtract.push(savedProfile._id.getTimestamp());
}