Поле смешанного типа схемы Mongoose ошибочно сохраняет поле ObjectId как строку

Я работаю над приложением чата, и каждое событие в разговоре имеет поле с именем отправитель - выглядит так:

var eventSchema = Schema({
    sender: {
        type: {}, //username && user_id fields
        required: true
    }
}

Каждый раз, когда создается Событие, я передаю объект, который выглядит следующим образом для поля отправителя:

{
    username: String,
    user_id: ObjectId("")
}

Я уверен, что поле user_id в Event.sender каждый раз имеет тип ObjectId.

Однако в базе данных сохраненные события иногда имеют Event.sender.user_id типа String &&, в других случаях Event.sender.user_id сохранен как тип ObjectId ().

{
    username: String,
    user_id: ObjectId("")    // sometimes it saves like this
}

{
    username: String,
    user_id: String    // other times it saves like this
}

Изменение происходит довольно часто, и есть события, отправленные одним и тем же пользователем, проходящие через одну и ту же функцию контроллера в течение 10 минут, демонстрируя это изменение.

Есть ли в Mongoose определенное поведение, которое я не учитываю и которое влияет на то, как ObjectIds сохраняются в поле смешанного типа схемы?

Это происходит при сохранении, а не при обновлении. В систему не вносятся обновления в поле Event.sender.


person Jorge Olivero    schedule 19.11.2014    source источник
comment
Почему вы используете смешанный тип вместо добавления полей username и user_id в схему?   -  person JohnnyHK    schedule 20.11.2014
comment
@JohnnyHK Это был путь, по которому мы пошли раньше. Есть идеи, в чем может быть причина этого разброса?   -  person Jorge Olivero    schedule 20.11.2014
comment
Понятия не имею. Если вы не можете предоставить пример кода, который его воспроизводит, я не уверен, чем мы можем помочь.   -  person JohnnyHK    schedule 20.11.2014
comment
@JohnnyHK понял это, оказалось, что это не проблема мангуста. В любом случае спасибо за ответ.   -  person Jorge Olivero    schedule 22.11.2014


Ответы (1)


Так что ответ был довольно неясным, поскольку он был скрыт от нас в нашей среде разработки. Проблема возникает только тогда, когда процесс Node кластеризован, что мы действительно видим только в производственной среде. Оказалось, что мы передавали Mongoose строковую версию user_id, поэтому проблема заключалась в том, что мы не понимали, как работает механизм Redis Store.

В производстве мы используем хранилище Redis для управления сеансами между процессами Node для socket.io. Итак, в середине рукопожатия HTTP-запрос может перейти к другому процессу, нежели тот, с которого вы изначально начали рукопожатие. Затем Redis Store преобразует объект рукопожатия в строку и отправляет его всем остальным запущенным процессам.

Из-за этого stringify оболочка ObjectId для user_id, которую мы используем во многих местах в нашем приложении, теряется, и мы в конечном итоге сохраняем строки в объекте-отправителе для многих наших событий.

Надеюсь, это поможет кому-то в будущем.

person Jorge Olivero    schedule 22.11.2014