我在使用Mongoose在MongoDB中创建新文档时遇到了问题。
新文件必须与模式完全相同吗?
我的意思是我有以下架构:
ar userSchema = new Schema({
userID: Number,
userName: String,
userEmail: String,
teams:Array,
fbUID: String,
googleUID: String,
twitter: String
});
但是要创建一个新用户文档我没有所有字段,所以我的文档不会包含所有字段作为上面的模式。
例如,我正在添加一个基于上面Schema的新文档。我的文件是:
var users = mongoose.model('users',userSchema);
var user = new users({
userID: id, //give the id of the next user in Dbase
userName: userName,
userEmail: 'userEmail',
teams:[],
fbUID: '1234'
});
user.save(function(err, user){
if(err) return console.error(err);
log.d("user salved", user);
});
所以,我没有所有的字段,到目前为止我无法保存任何Doc。
如果我没有在新文档中拥有Schema中的所有字段,这是否重要?
更新:
,第二个问题是我得到其中一个:
fbUID,
googleUID,
twitter
通过一个函数,我不知道我收到了哪些,所以我试图以这种方式保存文档:
function salveUser(userName, socialMediaType, socialMediaID){
var id;
users.count(function(err, count){
if(err){
log.d("Err in counting files")
}
id = count;
});
var user = new users({
userID: id, //give the id of the next user in Dbase
userName: userName,
userEmail: 'userEmail',
teams:[],
socialMediaType : socialMediaID
});
user.save(function(err, user){
if(err) return console.error(err);
log.d("user salved", user);
});
currentSession = sessionOBJ.login(id, socialMediaID);
return currentSession;
}
}
这就是为什么我想知道Mongoose是否通过我在函数中收到的单词切换文档中的键,或者它是否使用了我正在放置的单词,在这种情况下" socialMediaType&#34 ;
有人知道吗?
答案 0 :(得分:1)
看起来你的代码很好,正如列昂尼德在评论中所说的那样
我会尝试使用所有直接值保存用户,以排除任何未设置的变量....
所以试试这个:
var user = new users({
userID: 11, //give the id of the next user in Dbase
userName: 'John',
userEmail: 'John@john.com',
teams:['Blue', 'Green'],
fbUID: '1234'
});
如果可行则问题可能是在实际点击此消息之前尚未设置id
或userName
个变量。
您不必为所有字段添加值,因为它们位于模型中。
祝你好运!
答案 1 :(得分:1)
回答你的主要问题:不,新文件不应与模式完全相同。
实际上,除非您明确标记其中某些字段为required
,否则不需要在其架构中定义的文档字段以进行保存。
但是你在salveUser
函数中犯了几个错误。
首先,您的id = count
作业将在创建并保存user
文档很久之后发生,因为users.count
是异步的。这意味着您示例中的userID
始终为udefined
。
要解决此问题,您应该等待users.count
完成后再尝试使用它的结果:
users.count(function(err, count){
if(err){
return log.d("Err in counting files")
}
var user = new users({
userID: count, //give the id of the next user in Dbase
userName: userName
/* other fields */
});
user.save(/* your callback */);
});
其次,您似乎正在尝试将值socialMediaID
分配给名称等于socialMediaType
值的字段。但你不能按照自己的方式去做。因此,您不必设置fbUID
/ googleUID
字段,而是尝试设置一个不存在的socialMediaType
字段。
要解决此问题,您应该使用[]
分配:
var user = new users({
userID: id, //give the id of the next user in Dbase
userName: userName,
userEmail: 'userEmail'
});
user[socialMediaType] = socialMediaID;
由于您在userID
字段上没有唯一索引,因此MongoDB
会自动为所有文档分配唯一_id
,您应该能够成功{{1}你的文件。
但是在您的问题中,您说您无法执行此操作,这意味着您的代码中还有其他一些问题。请发布您在.save()
回调中mongoose
获得的确切例外。