我的机智在这里以猫鼬结尾,不确定我要去哪里。请帮帮我。
说我如下定义我的架构:
const userDBSchema = new Schema({
userName: {
type:String
},
musicType: {
type: String,
},
}, { collection: 'userData' });
然后使用此功能在数据库中发布帖子:
exports.saveUser = (req, res) => {
const username = req.params.user;
const newUser = new UserInfoDb(req.body, {'collection': username});
newUser.save((err, response) => {
//save operation
});
};
我收到此错误:
{
"message": "document must have an _id before saving",
"name": "MongooseError"
}
即使我手动定义了ID,也包含以下内容:
_id: {
type: mongoose.Schema.Types.ObjectId,
index: true,
required: true,
auto: true
},
我收到此错误:
{
"errors": {
"_id": {
"message": "Path `_id` is required.",
"name": "ValidatorError",
"properties": {
"message": "Path `_id` is required.",
"type": "required",
"path": "_id"
},
"kind": "required",
"path": "_id"
}
},
"_message": "userDB validation failed",
"message": "userDB validation failed: _id: Path `_id` is required.",
"name": "ValidationError"
}
最终我的目标是可以传递要从POST访问的集合的名称,然后将请求的正文写入该集合。我有多个集合可能需要在任何给定时间写。我权衡了决定将所有内容都包含一个集合的决定,但决定使用多个集合以存储我的数据。
答案 0 :(得分:1)
您可以确认要拥有多个集合,每个用户都有其数据库集合吗?我认为这不是一个好决定!
这是我的解决方案。您可以为具有相同架构({{1})的每个用户创建模型。
但是您应该确保可以为每个用户生成唯一的集合名称。 (例如哈希函数或其他任何东西)
我想再次确认,这不是为每个用户创建用于存储其信息的集合时的好方法。
为什么?
如果系统有数百万个用户,那么您将有数百万个集合,管理数据库非常复杂。集合中包含数百万个文档会更好。这是我个人的想法。希望对您有帮助
userDBSchema
这是我的演示简单应用程序,如何用猫鼬的模式创建动态模型,您可以在此处https://gist.github.com/huynhsamha/4dcf00a1fba96ae7f186b606b33b7e9c
查看完整的代码并在本地数据库中尝试使用在演示中,我创建了一个存储用户信息的模式
const mongoose = require('mongoose');
const userDBSchema = require('path/to/your/schema/declared');
// Generating unique collection name for each user
const getCollectionNameForUser = (username) => username;
exports.saveUser = (req, res) => {
const username = req.params.user;
const UserInfoDb = mongoose.model(getCollectionNameForUser(username), userDBSchema);
const newUser = new UserInfoDb(req.body);
newUser.save((err, response) => {
//save operation
});
};
并通过简单的API GET向每个用户添加const Schema = mongoose.Schema;
const UserInfoSchema = new Schema({
note: String,
timeline: { type: Date, default: Date.now }
});
(带有log
)
note
这是用于检索用户日志的API
app.get('/add/:id/:note', async (req, res) => {
const { id, note } = req.params;
// Retrieve model which contain info documents of user with id
const UserInfo = mongoose.model('User_' + id, UserInfoSchema);
const log = new UserInfo({ note });
await log.save();
res.send(log);
})
我已经测试了此代码,并且可以正常工作。每个用户都有一个集合来存储他的数据信息。
您可以在gist https://gist.github.com/huynhsamha/4dcf00a1fba96ae7f186b606b33b7e9c上使用代码下载并在本地进行检查。