模式中的Mongoose模式

0xS*_*ina 27 javascript mongoose node.js

如何将架构添加到另一个架构?这似乎没有效果:

var UserSchema = new Schema({
    name        : String,
    app_key     : String,
    app_secret  : String
})



var TaskSchema = new Schema({
    name            : String,
    lastPerformed   : Date,
    folder          : String,
    user            : UserSchema
})
Run Code Online (Sandbox Code Playgroud)

我检查了网站,它显示了如何为数组声明它,但不是单个.

谢谢

glo*_*tho 37

有几种方法可以做到这一点.最简单的就是:

var TaskSchema = new Schema({
    name            : String,
    lastPerformed   : Date,
    folder          : String,
    user            : Schema.ObjectId
});
Run Code Online (Sandbox Code Playgroud)

然后,您只需确保您的应用正在编写该ID并在查询中使用它以根据需要获取"相关"数据.

按用户ID搜索任务时这很好,但按任务ID查询用户时更麻烦:

// Get tasks with user id
Task.find({user: user_id}, function(err, tasks) {...});

// Get user from task id
Task.findById(id, function(err, task) {
  User.findById(task.user, function(err, user) {
    // do stuff with user
  }
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是利用Mongoose的填充功能来简化查询.为此,您可以执行以下操作:

var UserSchema = new Schema({
    name        : String,
    app_key     : String,
    app_secret  : String,
    tasks       : [{type: Schema.ObjectId, ref: 'Task'}] // assuming you name your model Task
});

var TaskSchema = new Schema({
    name            : String,
    lastPerformed   : Date,
    folder          : String,
    user            : {type: Schema.ObjectId, ref: 'User'} // assuming you name your model User
});
Run Code Online (Sandbox Code Playgroud)

有了这个,您对所有用户的查询,包括他们的任务数组可能是:

User.find({}).populate('tasks').run(function(err, users) {
  // do something
});
Run Code Online (Sandbox Code Playgroud)

当然,这意味着要在两个地方维护ID.如果这困扰你,最好坚持使用第一种方法,并习惯于编写更复杂(但仍然很简单)的查询.

  • 似乎`.run()`被`.exec()`取代了 (2认同)

Ben*_*son 11

从 4.2.0 版本开始,猫鼬支持单个子文档。

文档

var childSchema = new Schema({ name: 'string' });

var parentSchema = new Schema({
  // Array of subdocuments
  children: [childSchema],
  // Single nested subdocuments. Caveat: single nested subdocs only work
  // in mongoose >= 4.2.0
  child: childSchema
});
Run Code Online (Sandbox Code Playgroud)


Jam*_*son 10

这个简单的解决方案呢?

var TaskSchema = new Schema({
    name            : String,
    lastPerformed   : Date,
    folder          : String,
    user            : {
        name        : String,
        app_key     : String,
        app_secret  : String
    }
 })
Run Code Online (Sandbox Code Playgroud)

  • 这不会消除直接查询用户的能力,也可能导致用户对象在许多任务中被复制吗?如果您要将数据模型展平为一个结构,我认为您希望UserSchema成为任务的父级而不是相反. (8认同)