Nodejs 如何禁掉mongodb array中的_id

Nodejs 如何禁掉mongodb array中的_id

用mooogoose操作执行如下命令 Contacts.update({‘username’:req.params.user},{$addToSet:{‘contacts’:{‘cname’:req.body.name,‘cemail’:req.body.email,‘cinfo’:{‘mobile’:req.body.mobile,‘office’:req.body.office}}}},{upsert:true},function(){}); 这里update后contacts数组的每一项会自动添加一个_id,导致唯一性检验失败, 我从mongodb后台update的时候这么写的话是不会有_id的, 请教这种情况该如何解决, btw Contacts schema的 _id已设为false


4 回复

当然可以!在你的问题中,你提到使用Mongoose来更新MongoDB文档,并希望在contacts数组中避免自动添加_id字段。由于Mongoose默认会在嵌套对象中添加_id字段,我们需要手动处理这个问题。

以下是如何解决这个问题的步骤:

  1. 禁用Mongoose的默认行为:Mongoose会在每个嵌套对象中自动添加_id字段。我们可以通过设置_id: false来禁用这一点。
  2. 手动管理嵌套对象:在添加新的contact对象时,手动排除_id字段。

示例代码

首先,确保你的Contacts Schema定义中已经禁用了_id字段:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const ContactSchema = new Schema({
    cname: String,
    cemail: String,
    cinfo: {
        mobile: String,
        office: String
    }
}, { _id: false });

const Contacts = mongoose.model('Contacts', ContactSchema);

然后,在你的更新逻辑中,手动创建contact对象并插入到contacts数组中:

const mongoose = require('mongoose');
const Contacts = mongoose.model('Contacts');

Contacts.update(
    { username: req.params.user },
    {
        $addToSet: {
            contacts: {
                cname: req.body.name,
                cemail: req.body.email,
                cinfo: {
                    mobile: req.body.mobile,
                    office: req.body.office
                }
            }
        }
    },
    { upsert: true },
    function (err, result) {
        if (err) {
            console.error(err);
            return res.status(500).send("Error updating the document");
        }
        console.log(result);
        res.send("Document updated successfully");
    }
);

解释

  • 禁用 _id 字段:在定义ContactSchema时,通过设置{ _id: false }来禁用默认的_id字段。
  • 手动添加数据:在$addToSet操作中,直接指定需要添加的数据,不包含任何_id字段。这样可以确保不会自动添加_id字段。

通过这种方式,你可以避免Mongoose自动添加_id字段,从而解决唯一性检查失败的问题。希望这对你有所帮助!


解决了,为contacts建了一个subscheam这里设置{_id:false}

good,正愁这个事儿呢

在使用 Mongoose 操作 MongoDB 时,如果你不希望在 contacts 数组的每个元素中自动生成 _id 字段,可以通过在 Schema 定义中设置 autoCreate: false 来实现。

假设你的 Contacts Schema 定义如下:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const contactSchema = new Schema({
    cname: String,
    cemail: String,
    cinfo: {
        mobile: String,
        office: String
    }
}, { _id: false });

const ContactsSchema = new Schema({
    username: String,
    contacts: [contactSchema]
});

const Contacts = mongoose.model('Contacts', ContactsSchema);

module.exports = Contacts;

在这个定义中,我们已经将 contactSchema_id 设置为 false。这意味着当你将数据插入到 contacts 数组中时,Mongoose 将不会为每个元素自动生成 _id 字段。

此外,你可以直接通过代码更新数据,并确保不会生成 _id 字段:

Contacts.update(
    { 'username': req.params.user },
    {
        $addToSet: {
            'contacts': {
                'cname': req.body.name,
                'cemail': req.body.email,
                'cinfo': {
                    'mobile': req.body.mobile,
                    'office': req.body.office
                }
            }
        }
    },
    { upsert: true },
    function (err, res) {
        if (err) {
            console.error(err);
        } else {
            console.log(res);
        }
    }
);

确保在插入数据时,你不需要手动添加 _id 字段。如果 _id 仍然存在并且导致唯一性问题,检查你的应用逻辑是否意外地插入了重复的 _id

回到顶部