【问题标题】:Mongoose schema within schema模式中的猫鼬模式
【发布时间】:2012-02-02 22:58:46
【问题描述】:

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

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



var TaskSchema = new Schema({
    name            : String,
    lastPerformed   : Date,
    folder          : String,
    user            : UserSchema
})

我查看了网站,它显示了如何为数组声明它,而不是为单个。

谢谢

【问题讨论】:

  • 您是在两个集合之间进行连接还是要将它们存储在任务之上?

标签: javascript node.js mongoose


【解决方案1】:

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

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

然后您只需要确保您的应用正在写入该 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
  }
}

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

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
});

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

User.find({}).populate('tasks').run(function(err, users) {
  // do something
});

当然,这意味着在两个地方都维护 id。如果这让您感到困扰,最好还是坚持第一种方法,然后习惯于编写更复杂(但仍然足够简单)的查询。

【讨论】:

【解决方案2】:

从 4.2.0 版开始,mongoose 支持单个子文档。

来自the docs

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
});

【讨论】:

    【解决方案3】:

    这个简单的解决方案怎么样?

    var TaskSchema = new Schema({
        name            : String,
        lastPerformed   : Date,
        folder          : String,
        user            : {
            name        : String,
            app_key     : String,
            app_secret  : String
        }
     })
    

    【讨论】:

    • 这不会消除直接查询用户的能力,并且还可能导致用户对象在许多任务中重复吗?如果您要将数据模型扁平化为一个结构,我认为您希望 UserSchema 成为任务的父级,而不是相反。
    • 使代码看起来很乱。因此想要架构中的架构
    • 对于使用嵌入其中的多个或大型架构的架构,这不是一个可扩展的解决方案。我认为 OP(和我)想要不平凡的解决方案。
    猜你喜欢
    • 2016-08-05
    • 2020-09-18
    • 2018-04-17
    • 2021-09-21
    • 2015-05-20
    • 2013-01-25
    • 2012-04-22
    • 2018-02-05
    • 2019-03-22
    相关资源
    最近更新 更多