【问题标题】:How do you rename the _id field in mongoDB to a different key name?如何将 mongoDB 中的 _id 字段重命名为不同的键名?
【发布时间】:2021-05-02 17:07:54
【问题描述】:

我想将 MongoDB 自动生成的 _id 字段重命名为“ObjectID”。即,改变对象,使_id: xxxxx 变为ObjectID: xxxxx。这是我的对象的架构:

{
  skills: [ 'Programming', 'Design' ],
  paymentForms: [ 'Flat fee' ],
  _id: 6011a89084e07663d25e01af,
  title: 'Personal website development',
  description: 'I would like to have a personal website that showcases my resume and work portfolio.',
  otherSkills: '',
  price: '25-50',
  __v: 0
}

目前,我正在使用 mongoose 查询获取数据库中的文档,该查询返回文档数组。到目前为止,我已经尝试了两种方法——在获取此文档后,我映射每个元素并重命名 _id 键,但是,这两个函数都不起作用。代码如下:

function renameKey(obj, oldKey, newKey) {
    if (oldKey !== newKey) {
        console.log(Object.getOwnPropertyDescriptor(obj, oldKey))
        Object.defineProperty(obj, newKey,
            Object.getOwnPropertyDescriptor(obj, oldKey));
        delete obj[oldKey];
    }
}

此方法的问题是“getOwnPropertyDescriptor”返回未定义。我尝试的第二种方法是:

const renameKey = (obj, oldKey, newKey) => {
    const targetKey = obj[oldKey];
    console.log(targetKey);
    obj[newKey] = targetKey;
    console.log(obj);

    delete obj[oldKey];
    return obj;
}

这可能是重命名键的典型方法。但它不会改变我的对象,并返回相同的对象。在这两种情况下,这些方法都适用于我创建的文字对象,例如 { _id: 10 },但是,它不适用于从我的 mongoose 查询返回的对象。

谁能告诉我这些方法有什么问题,或者提供解决这个问题的替代方法,例如使用猫鼬投影重命名查询(如果可能的话,idk)?

【问题讨论】:

    标签: javascript mongodb mongoose


    【解决方案1】:

    _id 字段是 MongoDB 内部必需的,因此没有它您将无法存储文档。

    _id 的值无法更改,因此一种可能性是使用新字段名称再次存储该值。可能使用更新的管道形式。这会引入同步问题,但您可以查询并简单地投影 _id 字段。

    如果您更改查询以使用聚合系统,您可以添加一个新字段并删除管道中存在的 _id 字段:

    {$addFields: {ObjectId: "$_id"}},
    {$project: {_id: 0}}
    

    【讨论】:

    • 如何更改查询以使用 mongodb 驱动程序?我目前正在使用猫鼬,但如何切换?
    • Mongoose 也支持聚合
    猜你喜欢
    • 2017-05-19
    • 1970-01-01
    • 2018-08-10
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    相关资源
    最近更新 更多