javascript 模式中的Mongoose模式

dy1byipe  于 2023-08-02  发布在  Java
关注(0)|答案(4)|浏览(97)

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

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


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

字符串
我检查了网站,它显示了如何声明它的数组,但不是单一的。
谢啦,谢啦

k5ifujac

k5ifujac1#

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

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。如果这让您感到困扰,那么最好坚持使用第一种方法,并且习惯于编写更复杂(但仍然足够简单)的查询。

2ekbmq32

2ekbmq322#

从版本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
});

字符串

bybem2ql

bybem2ql3#

那么这个简单的解决方案呢?

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

字符串

aiqt4smr

aiqt4smr4#

var UserSchema = new Schema({
    name        : String,
    app_key     : String,
    app_secret  : String
});
var TaskSchema = new Schema({
name            : String,
lastPerformed   : Date,
folder          : String,
user            :{
type            : mongoose.Schema.Types.ObjectId,
ref             : 'User', // Reference the 'User' model
} 
});
const User=mongoose.model('User',UserSchema);
const Tasks=mongoose.model('Tasks',Taskschema);

字符串

  • TaskSchema中的user字段设置为对User模型的引用。使用mongoose.Schema.Types.ObjectId作为数据类型,表示user字段将存储User文档的ObjectId*。
    **ref:'User'**属性表示用户字段引用User模型。保存任务文档时,需要提供现有用户文档的_id(ObjectId),以将任务链接到相应的用户。

相关问题