【问题标题】:Mongodb: how to auto-increment a subdocument field?Mongodb:如何自动增加子文档字段?
【发布时间】:2013-11-18 02:25:53
【问题描述】:

以下文件记录了米尔豪斯和巴特之间的对话。我想在唯一操作中插入一条具有正确 num 的新消息(示例中的下一个为 3)。这可能吗?

    {   user_a:"Bart",
        user_b:"Milhouse",
        conversation:{
            last_msg:2,
            messages:[
                {   from:"Bart",
                    msg:"Hello"
                    num:1
                },
                {   from:"Milhouse",
                    msg:"Wanna go out ?"
                    num:2
                }
            ]
        }
     }

【问题讨论】:

    标签: arrays mongodb mongoose


    【解决方案1】:

    在 MongoDB 中,数组保持其顺序,因此通过添加 num 属性,您只会为无需额外字段即可完成的任务创建更多数据。只需使用数组中的位置来完成同样的事情。抓取数组中的 X 消息将提供比搜索 { num: X } 更快的搜索。

    为了保持顺序,我认为除了在插入新子文档并增加 last_msg 之前在 conversation.last_msg 上添加 find() 之外,没有简单的方法来添加 num 类别。

    根据您需要保留订购的内容,您可以考虑在子文档中包含时间戳,无论如何它通常保存在对话记录中,并且可能提供其他有用的信息。

    另外,我没用过,但是有一个 Mongoose 插件可能会也可能不会做你想做的事:https://npmjs.org/package/mongoose-auto-increment

    【讨论】:

    • 一旦我提取了我想要在 mongo 上下文之外使用它们的消息,我就会丢失这些信息。我希望每个消息对象在对话中都有自己的排名。
    • 您是返回整个消息数组,还是返回单个消息并想知道它们的位置?
    【解决方案2】:

    您不能创建自动递增字段,但可以使用函数来生成和管理序列: http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/ 

    【讨论】:

      【解决方案3】:

      我建议使用 时间戳 而不是数值。通过使用时间戳,您可以保持子文档的顺序并用于其他用途。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-12
        • 2014-12-25
        • 1970-01-01
        • 1970-01-01
        • 2014-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多