MongoDB插入option集合时,如何让嵌套数组对象自动生成_id?
解决MongoDB数组中子文档自动生成_id的问题
我之前也碰到过这个情况,MongoDB默认只会给顶层插入的文档自动生成_id字段,嵌套在数组里的子文档并不会触发这个自动生成机制,得我们手动处理才行。
原因说明
MongoDB的自动_id生成逻辑是针对顶层文档设计的:当你向集合插入一个文档时,MongoDB会自动为这个顶层文档分配ObjectId,但数组内的子文档属于嵌套结构,不在自动生成的范围内,必须显式指定_id。
修正后的插入代码
你只需要在数组里的每个子文档中,手动添加_id: new ObjectId()即可:
db.getCollection('option').insert({ "createdBy": "support", "optionName": "Nationality", "createdDate": new Date(), "isActive": true, "option": [ { "_id": new ObjectId(), // 手动生成子文档的ObjectId "optionValue": "Malaysian", "createdBy": "support", "createdDate": ISODate("2016-06-30T08:19:09.709Z"), "isActive": true }, { "_id": new ObjectId(), // 手动生成子文档的ObjectId "optionValue": "Singaporean", "createdBy": "support", "createdDate": ISODate("2016-06-30T08:19:09.709Z"), "isActive": true } ] })
额外提示
如果是在应用程序中(比如Node.js、Python等)操作MongoDB,需要使用对应驱动提供的ObjectId构造函数来生成:
- Node.js:
const { ObjectId } = require('mongodb');之后用new ObjectId()生成 - Python:
from bson.objectid import ObjectId之后用ObjectId()生成
执行这段代码后,你插入的文档中option数组内的每个子文档都会拥有独立的_id字段,和你目标文档的结构完全一致。
内容的提问来源于stack exchange,提问作者Viveka
相关产品推荐
相关产品推荐

