这是数据库中对象的结构。我需要嵌套的模式,因为数组的嵌套对象可能会在不同的时间更新,我需要知道这种情况是否会发生。
const PublicationSchema = new Schema({
id: String,
data: String,
}, {timestamps: true, _id: false]);
const AuthorSchema = new Schema({
id: String,
publications: [PublicationSchema]
}, { timestamps: true, _id: false});我的思考过程是,如果我在数组中找到元素,则将其设置为
AuthorModel.findOneAndUpdate(
{
id: authorId,
"publications.id": publicationId
},
{
$set: {"publications.$[pub]": theNewObject
},
{
arrayFilters: [{ 'publication.id': publicationId }],
new: true
},我得到了这个错误:
Updating the path 'publications.$[pub].updatedAt' would create a conflict at 'publications.$[pub]'我想提一下,如果我有:
const AuthorSchema = new Schema({
id: String,
publications: [Schema.Type.Mixed]
}, { timestamps: true, _id: false});那么我的函数就可以正常工作了,但是没有包含updatedAt字段。那么,如何使此更新与嵌套模式一起工作呢?
注意:即使在阅读了Similar Question,Similar Question2之后,我也不能理解为什么会发生这个错误。
发布于 2021-07-16 14:15:04
随着我越来越多地阅读Similar Question,唯一的解决办法似乎是:
AuthorModel.findOneAndUpdate(
{
id: authorId,
"publications.id": publicationId
},
{
$set: {
"publications.$[pub].id": theNewObject.id,
"publications.$[pub].title": theNewObject.title,
"publications.$[pub].content": theNewObject.content
}
},
{
arrayFilters: [{ 'publication.id': publicationId }],
new: true
}
}这样就不会产生updatedAt的冲突。在我的测试中,如果只更新数组的一项,就会得到新的updatedAt。
如果您使用的是大对象,而您不想设置每个字段,或者您事先不知道需要在嵌套对象中设置的所有字段,则另一个解决方法是将作者的模式设置为:
const AuthorSchema = new Schema({
id: String,
publications: [Schema.Type.Mixed]
}, { timestamps: true, _id: false});然后在findOneAndUpdate之前:
theNewObject.updatedAt: new Date();因此,您仍然可以使用:
publications.$[pub]": theNewObjecthttps://stackoverflow.com/questions/68389844
复制相似问题