2014-12-16 4 views
3

Как я могу найти документ, который делает .findOne, где поле ObjectId не задано? Я не могу найти, должен ли я искать по null или undefined или что-то еще.Mongooose query где ObjectId имеет значение null?

В приведенном ниже примере, я пытаюсь найти документ, в котором, как известно значение «электронная почта», но идента до сих пор не установлено:

var joinRequest = new mongoose.Schema({ 
    email: { type: String, unique: true, lowercase: true, trim: true }, 
    code: { type: String, uppercase: true, trim: true, select: false }, 
    lastSent: { type: Date }, 
    userId: { type: mongoose.Schema.Types.ObjectId, select: false } 
}); 

Затем снова, может ли ObjectId поле когда-либо ноль? Должен ли я использовать String здесь?

+0

в меру моих _id знаний всегда будет иметь только для чтения GUID присвоенные к нему –

+0

Это не поле _id. Это поле с типом ObjectId. Я пытаюсь использовать undefined, однако WebStorm выделяет его как переменную, которая заставляет меня беспокоиться. –

+0

Я не думаю, что функция 'findOne' будет смотреть на свойства с неопределенным значением при сопоставлении, таким образом, чтобы каждый раз находить самый первый документ (я тоже не думаю, что mongodb будет хранить undefined), вместо этого поиск по' null 'и хранить' null' –

ответ

4

Несколько вещей о undefined в контексте MongoDB

Свойства со значением undefined не сохраняются. Таким образом, следующая не будет a недвижимости

db.insert({a : undefined}) 

Однако для массивов в undefined значения преобразуются в null

db.insert({a : [undefined]}) //stores {a : [null]} 

Также undefined имеет странное поведение при использовании в качестве условия

db.users.find({a : undefined}) //finds everything 
db.users.findOne({a : undefined}) //always returns the first document (which is a problem for you) 
db.users.update({a : undefined}, {a : true}) //only updates documents with no a property 

Так Я бы избегал использования undefined и, вероятно, притворился, что он даже не существует. Вместо этого используйте null, так как он хранится и не иногда отбрасывается как условие.

Так, например

db.users.insert({email : "[email protected]", userID : null}); 
db.users.findOne({email : "[email protected]", userID : null}); 

Если вы решили использовать неопределенными, хотя сделать это как этот

db.users.insert({email : "[email protected]"}); 
db.users.findOne({email : "[email protected]", userID : { exists : false }}); //works for null as well 

http://docs.mongodb.org/manual/reference/operator/query/exists/

+0

определенно хранить 'null' ... или вы можете обратиться к оператору' $ exist' http://docs.mongodb.org/manual/reference/operator/query/exists/ –

Смежные вопросы