MongoDB中的新Document必须与Schema完全相同吗?

时间:2014-07-16 14:33:28

标签: node.js mongodb mongoose database-schema mongodb-query

我在使用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 ;

有人知道吗?

2 个答案:

答案 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'
 });

如果可行则问题可能是在实际点击此消息之前尚未设置iduserName个变量。

您不必为所有字段添加值,因为它们位于模型中。

祝你好运!

答案 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获得的确切例外。