猫鼬在更新时覆盖字段

时间:2019-09-02 00:57:35

标签: node.js mongodb mongoose

我尝试用新的个人资料更新用户时遇到问题,猫鼬会覆盖以前的个人资料,因此只允许他们拥有1个个人资料。

我在一个用户文档中包含其关联的配置文件,买卖双方,以及每个配置文件的一些数据,例如ID和信誉。 最初,用户没有个人资料,当我添加他的买方或卖方个人资料时,没有任何戏剧性,但是当我尝试添加其他个人资料时,他会写自己所在的个人资料。

此刻,我要添加个人资料(卖方是相同的,只是将买方更改为卖方):

const user = await User.findOne({_id: 'userId'});

const updatedUser = await user.updateOne({
    profiles: {
        buyer: {
            _id: buyerId,
            reputation: 50
        }
    }
});

他所做的就是给我写信给已经在那儿的那个人,我知道我很愚蠢地告诉他,通过那个物体,但是我还是尝试了。

我正在检查,发现他们放了一个$,所以我这样尝试了:

const user = await User.findOne({_id: 'userId'});
const updatedUser = await user.updateOne({
    profiles: {
        $set: {
            buyer: {
                _id: buyerId,
                reputation: 50
            }
        }
    }
});

这不应该给我写信,并且仅在不存在的情况下添加该字段,而在另一个字段中保持安静(这就是我想要的)。 但是我唯一实现的是我正在用一个空对象编写配置文件,而没有任何配置文件。

我要寻找的是让用户将配置文件放在那里,就像这样:

profiles: {
    buyer: {
        _id: 'fuckinid1',
        reputation: 50
    },
    seller: {
        _id: 'fuckinid2',
        reputation: 50
    },
}

我的模式是这样的:

const schema = new Schema({
    _id: { type: String },
    name : { type: String },
    surname : { type: String },
    email : { type: String, lowercase: true },
    profiles : {
        buyer: {
            _id : String,
            reputation: Number
        },
        seller: {
            _id : String,
            reputation: Number
        }
    }
});

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您应该尝试如下操作:

 let updateRecord = Test.findOneAndUpdate(
  { _id: test._id },
  { name: 'Test name' },
  { new: true, overwrite: true }
);

答案 1 :(得分:0)

更多内容,您应该检出findOneAndUpdate选项的mongoose docs。我也几乎不建议您使用findByIdAndUpdate,因为即使您需要检查文档是否存在,没有正确的选项也不会覆盖它。相反,如果不存在,它将创建新的。同样,默认情况下,MongoDB会为index字段创建一个_id,因此您的查询将使用索引执行得快得多,而无需索引。

此外,我注意到您正在使用embedded document structure。嗯,总是由您决定,但是我不确定您是否确实需要_id字段作为子文档。无论如何,如果您需要有关它的更多信息,请在下面的评论中标记我,然后我将尝试提供有关它的更多信息。