首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongoose架构混合类型字段错误地将ObjectId字段另存为字符串

Mongoose架构混合类型字段错误地将ObjectId字段另存为字符串
EN

Stack Overflow用户
提问于 2014-11-20 02:43:23
回答 1查看 716关注 0票数 0

我正在开发聊天应用程序,会话中的每个事件都有一个名为sender的字段-看起来像这样:

代码语言:javascript
复制
var eventSchema = Schema({
    sender: {
        type: {}, //username && user_id fields
        required: true
    }
}

每次创建事件时,我都会为发送者字段传入如下所示的对象:

代码语言:javascript
复制
{
    username: String,
    user_id: ObjectId("")
}

我确信Event.sender中的user_id字段每次都是ObjectId类型。

但是,在数据库中,保存的事件有时会有String &类型的Event.sender.user_id,而有时Event.sender.user_id会保存为ObjectId()类型。

代码语言:javascript
复制
{
    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字段进行更新。

EN

回答 1

Stack Overflow用户

发布于 2014-11-23 02:14:51

所以答案相当模糊,因为它在我们的开发环境中对我们是隐藏的。只有当Node进程被集群化时,问题才会发生,这是我们真正在生产中看到的。事实证明,我们传递给Mongoose的是user_id的一个字符串版本,所以问题出在我们对Redis Store机制的工作原理缺乏了解。

在生产中,我们使用redis store来管理socket.io的跨节点进程的会话。因此,在握手过程中,http请求可能会到达与最初开始握手时不同的进程。Redis Store然后将握手对象串化,并将其发送到所有其他正在运行的进程。

由于这个字符串符,我们在应用程序中的许多地方使用的user_id上的ObjectId包装器丢失了,我们最终在发送器对象中为许多事件保存了字符串。

希望这能帮助下一个人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27024511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档