2014-07-16 1 views
0

У меня возникают проблемы с созданием новых документов в MongoDB с использованием Mongoose.Должен ли новый документ в MongoDB быть точно таким же, как схема?

Должны ли новые документы быть точно такими же, как схемы?

Я имею в виду у меня есть следующие схемы:

ar userSchema = new Schema({ 

     userID: Number, 
     userName: String, 
     userEmail: String, 
     teams:Array, 
     fbUID: String, 
     googleUID: String, 
     twitter: String 


}); 

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

Например, я добавляю новый документ, основанный на Схеме выше. Мой Док:

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); 
    }); 

Так что, я не имею все поля, и я не мог сохранить любой док до сих пор.

Имеет ли значение, если у меня нет всех полей в Схеме в новом документе?

UPDATE:

и вторая проблема заключается в том, что я получаю один из них:

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».

Кто-нибудь знает?

+0

Ваш код выглядит отлично. Можете ли вы включить точное исключение, которое вы получаете? –

+0

Да. Я уточню вопрос. – debeka

ответ

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 ко всем документам, вы должны быть в состоянии успешно .save() ваш документ.


Но в вашем вопросе вы сказали, что не можете этого сделать, имея в виду, что у вас есть другая проблема в вашем коде. Пожалуйста, опубликуйте точное исключение, которое вы получаете от mongoose в callback.

+0

Спасибо за ваш ответ. Я действительно ценю это. :) – debeka

1

Похоже, вы код хорошо, как сказал Леонид в комментариях

Я хотел бы попробовать экономить пользователь всех прямых значений исключающих любые переменный не установлен ....

So попробуйте это:

var user = new users({ 
    userID: 11, //give the id of the next user in Dbase 
    userName: 'John', 
    userEmail: '[email protected]', 
    teams:['Blue', 'Green'], 
    fbUID: '1234' 
}); 

Если это работает, то проблема, вероятно, что id или userName переменные не были установлены, прежде чем на самом деле ударяя это сообщение.

Вам не нужно ставить значения для всех полей только потому, что они находятся в модели.

Удачи!