首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoError:更新路径'publications.$[pub].updatedAt‘将在'publications.$[pub]’处产生冲突

MongoError:更新路径'publications.$[pub].updatedAt‘将在'publications.$[pub]’处产生冲突
EN

Stack Overflow用户
提问于 2021-07-15 15:46:20
回答 1查看 49关注 0票数 1

这是数据库中对象的结构。我需要嵌套的模式,因为数组的嵌套对象可能会在不同的时间更新,我需要知道这种情况是否会发生。

代码语言:javascript
复制
const PublicationSchema = new Schema({
    id: String,
    data: String,
}, {timestamps: true, _id: false]);

const AuthorSchema = new Schema({
    id: String,
    publications: [PublicationSchema]
}, { timestamps: true, _id: false});

我的思考过程是,如果我在数组中找到元素,则将其设置为

代码语言:javascript
复制
AuthorModel.findOneAndUpdate(
    {
        id: authorId,
        "publications.id": publicationId
    },
    { 
        $set: {"publications.$[pub]": theNewObject
    },
    {
        arrayFilters: [{ 'publication.id': publicationId }],
        new: true
    },

我得到了这个错误:

代码语言:javascript
复制
 Updating the path 'publications.$[pub].updatedAt' would create a conflict at 'publications.$[pub]'

我想提一下,如果我有:

代码语言:javascript
复制
const AuthorSchema = new Schema({
    id: String,
    publications: [Schema.Type.Mixed]
}, { timestamps: true, _id: false});

那么我的函数就可以正常工作了,但是没有包含updatedAt字段。那么,如何使此更新与嵌套模式一起工作呢?

注意:即使在阅读了Similar QuestionSimilar Question2之后,我也不能理解为什么会发生这个错误。

EN

回答 1

Stack Overflow用户

发布于 2021-07-16 14:15:04

随着我越来越多地阅读Similar Question,唯一的解决办法似乎是:

代码语言:javascript
复制
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。

如果您使用的是大对象,而您不想设置每个字段,或者您事先不知道需要在嵌套对象中设置的所有字段,则另一个解决方法是将作者的模式设置为:

代码语言:javascript
复制
const AuthorSchema = new Schema({
    id: String,
    publications: [Schema.Type.Mixed]
}, { timestamps: true, _id: false});

然后在findOneAndUpdate之前:

代码语言:javascript
复制
theNewObject.updatedAt: new Date();

因此,您仍然可以使用:

代码语言:javascript
复制
publications.$[pub]": theNewObject
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68389844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档