Вложенная схема в Mongoose

#node.js #mongoose

#node.js #мангуст

Вопрос:

Спасибо за вашу помощь и драгоценное время. Как вы предположили, я создал схему, как показано ниже. Теперь я хочу получить записи на основе имени клиента, чтобы рассчитать часы, потраченные ими на каждую категорию. Пожалуйста, помогите мне в этом. Заранее спасибо.

/* var query = {‘расписания [0].категории [0].catname’:»Admin»} // Я хочу получить все записи или документы с помощью категории admin */

     Timesheet = new Schema({
      created: {type: Date, default: Date.now},
      categories: [{
        catname: String,
        custname: String,
        hours: Number
      }]
    });

    User = new Schema({
      name: { type: String, required: true },
      email:String,
      password:String,   
      type:String,  
      timesheets: [Timesheet]
    });
    //timesheets: [{type: mongoose.Schema.Types.ObjectId, ref: 'Timesheet'}
    var User = mongoose.model("User",User);
    var Timesheet = mongoose.model("Timesheet",Timesheet);

    module.exports = function(app) {

        var timedata = {        
            created: new Date('2014-06-05'),
          categories:[{catname:"Admin",cusname:"Sony",hours:8}]           
      }

      var user = new User({
          name:"Nelson",
          email:"nelson@gmail.com",
          password:"welcome123",
          type:"Solutions"
          });

      var timesheet = new Timesheet(timedata);
            user.timesheets.push(timesheet);  

        user.save(function(err,user){ 
          console.log(user.timesheets.timesheet);     
        })
         //console.log('category name');
         //console.log(user.timesheets[0].categories[0].catname) 
        var query = {'timesheets[0].categories[0].catname':"Admin"}
        // I want to get 
         all the records or documents with category admin      

        User.find(query,function(err,catname){
            console.log('catname')
            console.log(catname)

        })
 

Комментарии:

1. Цель SO не в том, чтобы пользователи редактировали свои вопросы, чтобы они стали ответом, иначе как это может быть кому-то полезно? Вместо этого, пожалуйста, примите ответ, который вы (очевидно) нашли полезным.

Ответ №1:

Чтобы создать дочернюю схему, вы должны сначала определить ее, а затем вставить в свою основную схему. В качестве альтернативы, если вы ожидаете много расписаний, вероятно, предпочтительнее ссылаться на независимую схему. В обоих случаях имело бы смысл присоединить их к пользовательской схеме:

 var Timesheet = new Schema({
  created: {type: Date, default: Date.now},
  categories: [{
    name: String,
    custname: String,
    hours: Number
  }]
});
 

Использование встроенных документов:

 var User = new Schema({
  timesheets: [Timesheet]
});
 

Затем вставка может быть выполнена непосредственно с помощью:

 // create new timesheet doc using your user doc
var timesheet = user.timesheets.create(myData);
user.timesheets.push(timesheet);
 

или просто:

 user.timesheets.push(data);
 

Использование документов, на которые ссылаются:

 var User = new Schema({
  timesheets: [{type: Schema.Types.ObjectID, ref: 'Timesheet'}]
});
 

вставить с:

 // push timesheet reference to your user doc
var timesheet = new Timesheet(data);
user.timesheets.push(timesheet._id);