我尝试用新的个人资料更新用户时遇到问题,猫鼬会覆盖以前的个人资料,因此只允许他们拥有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
}
}
});
我该怎么做?
答案 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
字段作为子文档。无论如何,如果您需要有关它的更多信息,请在下面的评论中标记我,然后我将尝试提供有关它的更多信息。