Mongoose 参考儿童

Posted

技术标签:

【中文标题】Mongoose 参考儿童【英文标题】:Mongoose Refs to children 【发布时间】:2017-01-13 03:07:45 【问题描述】:

我正在努力寻找有关猫鼬儿童种群的示例或文档。

http://mongoosejs.com/docs/populate.html

关于他们拥有的文档:

var mongoose = require('mongoose')
  , Schema = mongoose.Schema

var personSchema = Schema(
  _id     : Number,
  name    : String,
  age     : Number,
  stories : [ type: Schema.Types.ObjectId, ref: 'Story' ]
);

var storySchema = Schema(
  _creator :  type: Number, ref: 'Person' ,
  title    : String,
  fans     : [ type: Number, ref: 'Person' ]
);

var Story  = mongoose.model('Story', storySchema);
var Person = mongoose.model('Person', personSchema);

这是有道理的,一个人可以有很多故事,因此“父”字段“故事”包含所有故事的列表。

我很难理解的是如何将故事推入人物模式。

例如,我有一个作业架构

var mongoose      = require ( 'mongoose' ),
    Schema        = mongoose.Schema;

var assignmentSchema = new Schema (
    
        _id: String,
        assignName: String,
        modInsID: [ type: Schema.Types.Number, ref: 'ModuleInst' ],
        studentAssigns: [type: Schema.Types.ObjectId, ref: 'StudentAssign' ]
    
);

module.exports = mongoose.model ( 'Assignment', assignmentSchema );

studentAssigns 存储了studentAssigns 的所有 id,然后可以与.pre 中间件一起使用进行级联删除。

现在我的 StudentAssign 架构:

var mongoose      = require ( 'mongoose' ),
    autoIncrement = require ( 'mongoose-auto-increment' ),
    Schema        = mongoose.Schema;

var connection = mongoose.createConnection("************");
autoIncrement.initialize(connection);


var studentAssignSchema = new Schema (
    
        assID: [ type: Schema.Types.String, ref: 'Assignment' ],
        studentID: [ type: Schema.Types.Number, ref: 'Student' ]
    
);

var StudentAssign = connection.model('StudentAssign', studentAssignSchema);
module.exports = mongoose.model ('StudentAssign', studentAssignSchema );

如您所见,它已经在引用“Assignment

这是我的 api 代码:

studentAssign 发布:

router.route('/student-assignment').post( function(req, res) 
    var studentAssign = new StudentAssign();
    studentAssign.assID = req.body.assID;
    studentAssign.studentID = req.body.studentID;

    studentAssign.save(function(err, studentAssign) 
        if(err) console.log(err);
        res.status(200).json(studentAssign);
    );
)

这就是我感到困惑的部分,我将在哪里将“studentAssign”推入“Assignment”架构的“studentAssigns”数组??

这是我当前的 api json 回调:

[
  
    "_id": "As 1",
    "assignName": "Software Implementation",
    "__v": 0,
    "studentAssigns": [],
    "modInsID": [
      
        "_id": 22,
        "semester": "TRI 3",
        "year": 2016,
        "__v": 0,
        "modID": [
          111
        ]
      
    ]
  
]

文档并没有说清楚,因为它们只是显示:

aaron.stories.push(story1); aaron.save(callback);

没有解释?

我尝试过: var assignment = new Assignment(); assignment.studentAssigns.push(studentAssign); 什么都没有存储??

【问题讨论】:

你调用 assignment.save(); ? @Molda 是的,对不起,我没有复制那部分 【参考方案1】:
router.get('/author', (req, res, next) => 
  Person. 
  find().
  exec( (err, person) => 
    if (err) return handleError(err) 
    Story.find(author: person[0]._id).
    exec( (err, story) => 
      if (err) return handleError(err) 
        person[0].stories.push(story[0])
      res.json(  person: person )
    )
  )
)

【讨论】:

请在您的答案中添加一些解释性文字。为什么以及如何解决 OP 的问题?【参考方案2】:

你的模型状态:

assID: [ type: Schema.Types.String, ref: 'Assignment' ],
studentID: [ type: Schema.Types.Number, ref: 'Student' ]

我认为根据您的代码,您不想在 assID 中存储多个作业,在 studentID 中存储多个学生。将您的模型修改为

assID:  type: Schema.Types.String, ref: 'Assignment' ,
studentID:  type: Schema.Types.Number, ref: 'Student' 

您的保存代码可以保持不变。

如果您确实想存储多个分配,例如,您需要将它们推送到 assID 数组中;-)

【讨论】:

以上是关于Mongoose 参考儿童的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 通过参考搜索自动填充数据

Mongoose:查询参考文档数组上的字段,[重复]

在参考 Mongoose 中创建唯一索引

Nodejs,Mongoose,Express:类型:Schema.ObjectId,参考:'Account' 不起作用

Mongoose 不参考新保存的文档填充以前保存的文档

NestJS/Mongoose - 参考另一个模式创建一个对象数组