在猫鼬数组中查找和更新单个元素

时间:2020-09-27 16:52:01

标签: node.js mongodb express mongoose

我想在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}]

我想运行一个更新功能,

  1. 查找具有匹配的userId的文档
  2. 如果{fieldId:something},{fieldVal:somethingElse}还不存在,则向fieldId数组中插入新元素
  3. 或基于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.`);
  }

0 个答案:

没有答案