• MongoDB 字段增长


    MongoDB中存储的文档必须有一个"_id"键。这个键的值可以是任何类型的,默认是个ObjectId对象。

    ObjectId 是一个12字节 BSON 类型数据,有以下格式:

    • 前4个字节表示时间戳
    • 接下来的3个字节是机器标识码
    • 紧接的两个字节由进程id组成(PID)
    • 最后三个字节是随机数。

    在一个集合里面,每个集合都有唯一的"_id"值,来确保集合里面每个文档都能被唯一标识。

    MongoDB采用ObjectId,而不是其他比较常规的做法(比如自动增加的主键)的主要原因,因为在多个 服务器上同步自动增加主键值既费力还费时。

    虽然MongoDB 没有像 SQL 一样有自动增长的功能, 但在某些情况下,我们可能需要实现 ObjectId 自动增长功能。

    由于 MongoDB 没有实现这个功能,我们可以通过编程的方式来实现,以下我们将在 counters 集合中实现_id字段自动增长。

    使用 counters 集合

    考虑以下 products 文档。我们希望 _id 字段实现 从 1,2,3,4 到 n 的自动增长功能。为此,创建 counters 集合,序列字段值可以实现自动长

    >db.createCollection("counters")

    sequence_value 字段是序列通过自动增长后的一个值。

    使用以下命令插入 counters 集合的序列文档中:

    >db.counters.insert({_id:"productid",sequence_value:0})

    创建 Javascript 函数

    现在,我们创建函数 getNextSequenceValue 来作为序列名的输入, 指定的序列会自动增长 1 并返回最新序列值。在本文的实例中序列名为 productid 。

    >function getNextSequenceValue(sequenceName){
       var sequenceDocument = db.counters.findAndModify(
          {
             query:{_id: sequenceName },
             update: {$inc:{sequence_value:1}},
             new:true
          });
       return sequenceDocument.sequence_value;
    }

    使用 Javascript 函数

    接下来我们将使用 getNextSequenceValue 函数创建一个新的文档, 并设置文档 _id 自动为返回的序列值:

    >db.products.insert({
       "_id":getNextSequenceValue("productid"),
       "product_name":"Apple iPhone",
       "category":"mobiles"})
    
    >db.products.insert({
       "_id":getNextSequenceValue("productid"),
       "product_name":"Samsung S3",
       "category":"mobiles"})

    就如你所看到的,我们使用 getNextSequenceValue 函数来设置 _id 字段。

    为了验证函数是否有效,我们可以使用以下命令读取文档:

    >db.prodcuts.find()

    以上命令将返回以下结果,我们发现 _id 字段是自增长的:

    { "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}
    
    { "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }
  • 相关阅读:
    分享最好的HTML5编码教程和参考手册
    随机字符变换效果的jQuery插件开发教程
    拒绝用SEO的眼光来设计你的Meta标签
    GBin1教程:使用jQuery插件jquery.validationEngine实现表单验证功能
    vs 2010 程序发布时出现 TransformXml任务意外失败
    CSS hack
    javascript div 弹出可拖动窗口
    Javascript String类的属性及方法
    兼容浏览器的布局CSS
    该伙伴事务管理器已经禁止了它对远程/网络事务的支持
  • 原文地址:https://www.cnblogs.com/longjshz/p/5131501.html
Copyright © 2020-2023  润新知