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
当然可以!在你的问题中,你提到使用Mongoose来更新MongoDB文档,并希望在contacts
数组中避免自动添加_id
字段。由于Mongoose默认会在嵌套对象中添加_id
字段,我们需要手动处理这个问题。
以下是如何解决这个问题的步骤:
- 禁用Mongoose的默认行为:Mongoose会在每个嵌套对象中自动添加
_id
字段。我们可以通过设置_id: false
来禁用这一点。 - 手动管理嵌套对象:在添加新的
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
。