2017-07-12 71 views
1

我对NoSQL世界是全新的,并且很难围绕它进行思考。这一周,我正在学习的MongoDB(猫鼬)用Node.js的,这里是我的当前模式:关于Mongoose Schema设计的问题

var eventDataSchema = new Schema({ 
    _id  : Number, 
    notes  : {type: String, required: true}, 
    start_date : {type: Date, required: true}, 
    end_date : {type: Date, required: true}, 
}, { 
    id   : false, 
    collection : 'event-data' 
}); 
eventDataSchema.plugin(AutoIncrement); 

var EventData = mongoose.model('EventData', eventDataSchema); 

现在,这是工作,我想补充一个用户名和密码,并有机会获得有个人访问EventData

另外...后来,如果我想只发送一个JSON的eventData,但不是用户到我的JavaScript,我该怎么做?

我现在送我EVENTDATA我的JS在此格式的方法:

router.get('/data', function(req, res){ 
    EventData.find({}, function(err, data){ 
    if (err) { 
     console.error('Error occured'); 
    } 
    res.send(data); 
    }); 
}); 

再次感谢

+0

能否请你更具体? –

+0

当然...我想在这个模式中实现用于身份验证的用户名和密码,但是在这个模式中,我还希望有很多的eventData块。例如: 用户:John Doe的 密码:123个 事件:[{_id:1 说明:事件A 起始日期:1/1/01, END_DATE:1/1/01, },{ _id:2 笔记:事件B 起始日期:01年1月2日, END_DATE:01年1月2日, },{ _id:3个 笔记:事件C 起始日期:01年1月3日, END_DATE:1/3/01, }] – user258813

+0

John Doe会注册并可以访问他的活动A,B和C.虽然可能会有另一个用户使用不同的事件集合 – user258813

回答

1

,我可以理解你想添加事件的关键在你的架构。那么你的架构将是这样的:

var userSchema = new Schema({ 
     user: { type: String, required: true, trim: true }, 
     password: { type: String, required: true, trim: true }, 
     events: [{ 
      notes: { type: String,required: true, trim: true }, 
      start_date: { type: Date,required: true }, 
      end_date: { type: Date,required: true } 
      }] 
    } 
    userSchema.plugin(AutoIncrement); 
    var userSchema = mongoose.model('userSchema', userSchema); 
}); 

如果上面的代码不能正常工作,那么你可以创建两个模式,一个为EVENTDATA用户等,并可以在userSchema填充您的EVENTDATA。

因此您的代码将是这样的:

userSchema.js:

var userSchema = new Schema({ 
     user: { type: String, required: true, trim: true }, 
     password: { type: String, required: true, trim: true }, 
     events: {type: mongoose.Schema.Types.ObjectId, ref: 'EventData' } 

    userSchema.plugin(AutoIncrement); 
    module.exports = mongoose.model('userSchema', userSchema); 
}); 

而且你eventDataSchema将是:

eventSchema.js:

var eventDataSchema = new Schema({ 
      notes: { type: 'string',required: true, trim: true }, 
      start_date: { type: Date,required: true }, 
      end_date: { type: Date,required: true } 
    } 
    eventDataSchema.plugin(AutoIncrement); 
    module.exports = mongoose.model('EventData', eventDataSchema); 
}); 

然后你就可以得到结果类似: index.js:

var eventSchema = require('./eventSchema'); 
var userSchema = require('./userSchema'); 

var populate = [{ 
     path: 'events', 
     model: 'EventData', 
     select: '_id notes start_dat end_date' 
    }]; 

var find = function (query) { 
    return userSchema.find(query).populate(populate).exec(); 
} 
console.log(find()); 

结果:

{ 
     _id:cfgvhbjnkmkdcfxghgjklxnmbxhdhjxjhjhgx, 
     user: John Doe, 
     password: 123, 
     events: [ { _id: 1gfye56785g3ycgevhxeftx568765egcd, 
        notes: Event A, 
        start_date: 1/1/01, 
        end_date: 1/1/01 
       } ] 

} 
+0

谢谢好的先生。这正是我努力想要理解的,但看到你的榜样,现在它变得更有意义。 – user258813

+0

欢迎@ user258813 –