我想在Mongo(使用Mongoose)中将(新)元素更新或插入到数组中。
模式如下:
let fieldsSchema = new mongoose.Schema({
recordCreatedAt: Date,
recordUpdatedAt: Date,
userId: {
type: String,
lowercase: true,
validate: (value) => {
return validator.isEmail(value);
},
},
customerId: {
type: String,
required: false,
unique: false,
},
fields: {
type: Array,
required: false,
unique: false,
},
});
“字段”将为空数组或包含以下格式的数据:
[{fieldId:something},{fieldVal:somethingElse}...{fieldId:testing},{fieldVal:somethingTest}]
我想运行一个更新功能,
userId
的文档{fieldId:something},{fieldVal:somethingElse}
还不存在,则向fieldId
数组中插入新元素fieldId
更新现有的数组元素(如果它已作为键存在于数组中的某个位置)。因此,如果此文档存在:
{
userId: 1,
customerId: 1,
fields: [{fieldId:something},{fieldVal:somethingElse}]
}
并通过了包含{fieldId:something}
的更新操作,然后{fieldVal:somethingElse}
被更新为:
{
userId: 1,
customerId: 1,
fields: [{fieldId:something},{fieldVal:NEWDATA}]
}
但是,如果fields
没有与fieldId
匹配的元素,则将元素{fieldId:something},{fieldVal:NEWDATA}
插入数组以达到相同的结果。
到目前为止,我已经尝试了各种方式的$ push和$ set类型的操作,并获得了不同程度的成功。我可以使用$ push迭代地向数组添加新元素,但是它不尊重fieldId:something
已经存在的事实,并且总是在数组中创建一个新元素。
我目前正在使用$ set,如下所示,但这会返回错误:The positional operator did not find the match needed from the query.
可能是因为它需要首先创建-但是如果在同一更新操作中不存在,该如何创建?
const findClientField = await FieldsModel.findOneAndUpdate(
{
clientId: req.body.userId,
},
{
$set: { 'fields.$.fieldId': `yourValue` },
},
{
new: true,
upsert: true,
}
);
console.log(findClientField);
} catch (e) {
console.log(e);
} finally {
res.status(200).send(`Field saved.`);
}