首页 > 解决方案 > 创建文档时,如何将 objectId 的值设置为与 _id 不同的另一个属性?

问题描述

我正在尝试创建一个如下所示的对象:

const userSettingsSchema = extendSchema(HistorySchema, {
  user: //ObjectId here,
  key:{type: String}, 
  value:{type: String} 
});

这是路由器中声明的 post 方法

app.post(
  "/api/user/settings/:key",
  userSettingsController.create
);

这是“创建”方法:

async create(request, response) {   
  try {
    const param = request.params.key;
    const body = request.body;
    console.log('body', body)
    switch (param) {
      case 'theme':
        var userSettings = await UserSettings.create(body) // user:objecId -> missing...
        response.status(201).send(userSettings);
        break;
    }

  } catch (e) {
    return response.status(400).send({ msg: e.message });
  }
}

我不知道如何将值分配给ObjectId属性user,因为ObjectId是在创建文档时生成的,因此,我不能这样做:userSettings.user = userSettings._id,因为对象已经存在。我只能设法创建这样的东西:

{
    "_id": "60c77565f1ac494e445cccfe",
    "key": "theme",
    "value": "dark",
}

但它应该是:

{
    "user": "60c77565f1ac494e445cccfe",
    "key": "theme",
    "value": "dark",
}

标签: mongodbmongoose

解决方案


_id 是文档的唯一强制性属性。它是文档的唯一标识符,您不能将其删除。

如果您提供没有 _id 的文档,驱动程序将生成一个。

您可以将 ObjectId 生成为

let id = mongoose.Types.ObjectId();

并将其分配给您想要的任意数量的属性。

您甚至可以为同一文档的不同属性生成多个不同的 ObjectId。

现在,您实际上不需要将 ObjectId 分配给“用户”属性。_id 会做得很好。实际上,您很可能不需要单独集合中的用户设置,尤其是作为具有单个键值对的多个文档。

您应该将“设置”属性作为键值 json 嵌入到“用户”集合中。


推荐阅读