MongoDB / mongoose - 未保存嵌套文档

时间:2018-01-21 16:18:11

标签: node.js mongodb mongoose

我有4个模型,GridContainerRowColumn。我需要初始化一个Grid,其中3个模型嵌套在其中。

我遇到的问题是创建了对ContainerRowColumn的引用(ObjectId s),但文档本身并非如此保存。仅保存Grid文档。

我希望它能将其余的模型保存到各自的系列中......

我错过了什么?

以下是我的模型/模式:

const GridSchema = new Schema({
  container: {type: mongoose.Schema.Types.ObjectId, ref: 'Container', required: true}
});

const ContainerSchema = new Schema({
  rows: [{type: mongoose.Schema.Types.ObjectId, ref: 'Row'}]
});

const RowSchema = new Schema({
  columns: [{type: mongoose.Schema.Types.ObjectId, ref: 'Column'}]
});

const ColumnSchema = new Schema({
  modules: [{type: mongoose.Schema.Types.ObjectId, ref: 'Module'}]
});

const Grid = mongoose.model('Grid', GridSchema);
const Container = mongoose.model('Container', ContainerSchema);
const Row = mongoose.model('Row', RowSchema);
const Column = mongoose.model('Column', ColumnSchema);

这是我如何启动网格并保存它:

  const grid = new Grid({
    container: new Container({
      rows: [
        new Row({
          column: [
            new Column({
              modules: []
            })
          ]
        })
      ]
    })
  });

  grid.save((err, grid) => {
     console.log(err, grid); // No error is thrown
  });

1 个答案:

答案 0 :(得分:1)

当然,由于您没有拨打.save()来电,因此不会保存嵌套文档。

此外,不是像这样创建,而是单独创建,然后使用它们的引用或变量来处理。这将使您的工作更轻松,更清洁。

编辑指定如何一次进行多次保存。

你可以这样做:

column = new Column({
    modules: []
});
row = new Row({
    column: [column._id]
});
container = new Container({
    rows: [row._id]
});
grid = new Grid({
    container
});
Promise.all([column.save(), row.save(), container.save(), grid.save()]).then((docs) => {
    //all the docs are conatined in docs, this is success case, i.e. all document gets saved
    console.log(docs);
}).catch((error) => {
    // handle error here, none of the documents gets saved
    // if saving of anyone of the documents fails, it all gets failed
});

Promise.all()对于保存这样的多个文档非常有用。由于Mongodb没有支持交易的功能。

我为迟到的回复道歉。