簡體   English   中英

模式中的貓鼬模式

[英]Mongoose schema within schema

如何將架構添加到另一個架構? 這似乎無效:

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



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

我檢查了網站,它顯示了如何為數組聲明它而不是為單個聲明。

謝謝

有幾種方法可以做到這一點。 最簡單的就是這樣:

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 的填充功能來簡化您的查詢。 為此,您可以執行以下操作:

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。 如果這讓您感到困擾,最好堅持使用第一種方法並習慣於編寫更復雜(但仍然足夠簡單)的查詢。

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

這個簡單的解決方案怎么樣?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM