MongoDB嵌套文档查询与mongoose子文档数组插入异常排查
问题原因
- 循环赋值逻辑错误:for循环中每次都将
docs变量直接覆盖为当前循环生成的单个文档对象,没有做数组追加操作,循环执行完成后docs仅保留最后一次迭代生成的1条数据,和schema定义的数组类型不匹配,最终存入的docs数组自然只有1条记录。 - 变量声明不规范:循环外提前声明了
let doc,循环内部又重复使用const doc声明同名变量;且docs未提前初始化为数组,直接赋值单值不符合字段类型要求。 - 冗余模型定义:子文档数组不需要单独创建对应Model,原代码中
const Doc = mongoose.model('Doc', docSchema)会额外生成独立的docs集合,属于不必要的冗余写法。
修正后的插入代码
mongoose.connect("mongodb://127.0.0.1:27017/stationDB"); const docSchema = mongoose.Schema({ naturka: String, address: String, coefficient: String, wheel: String, weight: Number }) const stockSchema = mongoose.Schema({ rollingStockNumber: String, docs: [docSchema] }); // 仅需要创建父文档对应的Model,删除子文档冗余的Model声明 const Stock = mongoose.model('Stock', stockSchema); // 提前初始化docs为空数组 const docs = []; // 循环变量i用let声明避免全局污染 for(let i = 0; i < naturkaMinifiedArrayReady.length; i++){ const singleDoc = { naturka: naturkaMinifiedArrayReady[i], address: arrayOfWayPlanForm[i], coefficient: valueOfCarLength[i], wheel: numberOfWheels[i], weight: valueOfCarWeight[i] }; // 将每个子文档追加到数组中,而非覆盖变量 docs.push(singleDoc); } const stock = new Stock({ rollingStockNumber: rollingStock, docs: docs }); stock.save((err) => { if (err) { res.redirect('/') } });
嵌套子文档常用查询方法
- 查询所有docs数组中存在符合条件子文档的父文档:
// 示例:查询docs中address为Toshkent的所有Stock记录 Stock.find({ "docs.address": "Toshkent" }, (err, stockList) => { // 处理返回结果 })
- 查询时仅返回数组中匹配的第一条子文档,过滤其他不匹配的子项:
Stock.find( { "docs.address": "Toshkent" }, // 使用$投影符返回匹配的第一个子文档 { "docs.$": 1, rollingStockNumber: 1 }, (err, result) => {} )
- 提取所有父文档下的全部子文档,脱离父文档结构返回:
Stock.aggregate([ // 将docs数组拆分为单条记录 { $unwind: "$docs" }, // 将子文档提升为根节点 { $replaceRoot: { newRoot: "$docs" } } ], (err, allSubDocs) => { // allSubDocs即为所有子文档组成的数组 })
内容的提问来源于stack exchange,提问作者83hru2
相关产品推荐
相关产品推荐

