Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java mongodb中_id列的唯一性_Java_Mongodb_Mongoid_Mongodb Query - Fatal编程技术网

Java mongodb中_id列的唯一性

Java mongodb中_id列的唯一性,java,mongodb,mongoid,mongodb-query,Java,Mongodb,Mongoid,Mongodb Query,我想使用自定义id生成。下面是我如何使用它。请为预期问题提供指导 当前实施 我在mongo中收集了多个文档嵌套。对于我在特定级别插入的每个文档,它都有一个唯一的_id。但是,在不同级别上_id可能会重复自身。_id可能也会在另一个集合中重复 我当前的数据集obj=A.create => # >对象b[#] >obj.as_文件 =>{“\u id”=>BSON::ObjectId('5743f10b0da757b22a1cfa69'),“b”=>[{“\u id”=>BSON::ObjectId

我想使用自定义id生成。下面是我如何使用它。请为预期问题提供指导

当前实施 我在mongo中收集了多个文档嵌套。对于我在特定级别插入的每个文档,它都有一个唯一的_id。但是,在不同级别上_id可能会重复自身。_id可能也会在另一个集合中重复

我当前的数据集<300个文档,嵌套级别为2级。 1.我在处理大型数据集时会遇到问题吗? 2.切分问题?
3.还有其他事情吗?

好的,简而言之,答案是:是的,您可能会遇到挑战,除非您试图解决默认设置无法解决的问题,否则不建议您这样做

长答案需要简短介绍mongoid如何实现_id

请看这里:

  field(
        :_id,
        default: ->{ BSON::ObjectId.new },
        pre_processed: true,
        type: BSON::ObjectId
      )
其次,mongoid将身份处理为类和id的组合:

    def identity
      [ self.class, self._id ]
    end
现在,BSON::ObjectId.new(BSON的规范)创建了一个12字节的值,其中包括一个4字节的时间戳(0..3)、一个3字节的机器id(4..6)、一个2字节的进程id(7..8)和一个3字节的计数器(9..11)

它记录生成的时间,这非常便于了解:

> BSON::ObjectId.new.generation_time
=> 2016-05-24 05:47:20 UTC
使用BSON::ObjectId作为_id的基本原理是可索引的好处。由于它是基于时间的,因此在索引中查找基于时间的值很快。它在两个并发线程(不同的进程,由不同的机器)中都是唯一的,并且是自己的(因此同一进程上同一秒内的操作的inc计数器)。这只需要在集合中是唯一的,因为标识是类id和\u id的组合

回答您的问题

从您所写的内容来看,假设您正在将文档嵌入彼此中。由于嵌入文档只能从实际文档中搜索,并且嵌入文档有自己的类,因此_id只需要在该类中是唯一的

例如:

class A
  include Mongoid::Document
  embeds_many :b
  embeds_many :c, class_name: 'B'
end 

class B
  include Mongoid::Document
  embedded_in :a
end

>obj = A.create
=> #<A _id: 5743f10b0da757b22a1cfa69, >

> obj.b << B.new
=> [#<B _id: 5743f12f0da757b22a1cfa6a, >]

> obj.as_document
=> {"_id"=>BSON::ObjectId('5743f10b0da757b22a1cfa69'), "b"=>[{"_id"=>BSON::ObjectId('5743f12f0da757b22a1cfa6a')}]}

> A.find_by('b._id' => BSON::ObjectId('5743f12f0da757b22a1cfa6a'))
=> #<A _id: 5743f10b0da757b22a1cfa69, >

>obj.c << B.new
=> [#<B _id: 5743f2590da757b22a1cfa6b, >]

> obj.as_document
=> {"_id"=>BSON::ObjectId('5743f10b0da757b22a1cfa69'), "b"=>[{"_id"=>BSON::ObjectId('5743f12f0da757b22a1cfa6a')}], "c"=>[{"_id"=>BSON::ObjectId('5743f2590da757b22a1cfa6b')}]}
A类
include Mongoid::Document
嵌入多个:b
嵌入多个:c,类名称:“B”
结束
B类
include Mongoid::Document
嵌入:a
结束
>obj=A.create
=> #
>对象b[#]
>obj.as_文件
=>{“\u id”=>BSON::ObjectId('5743f10b0da757b22a1cfa69'),“b”=>[{“\u id”=>BSON::ObjectId('5743f12f0da757b22a1cfa69')}]
>A.find_by('b._id'=>BSON::ObjectId('5743f12f0da757b22a1cfa6a'))
=> #
>对象c[#]
>obj.as_文件
=>{“\u id”=>BSON::ObjectId('5743f10b0da757b22a1cfa69'),“b”=>[{“\u id”=>BSON::ObjectId('5743f12f0da757b22a1cfa6a')}],“c”=>BSON::ObjectId('5743f250da757b22a1cfa6b')}

从上面可以看出,您可以使用_id的mongoid实现在嵌入式文档中进行搜索、存储和查找。由于BSON::ObjectId在当时是唯一的,即使在嵌入式文档中也是如此,因此我们(社区)您可能正试图解决默认实现已经解决的问题,因此需要有关自定义id的基本原理的信息。希望以上内容能让您深入了解指导决策的机制

谢谢,这是一个非常全面的答案。然而,要回答你的问题,没有具体说明为什么会这样。
class A
  include Mongoid::Document
  embeds_many :b
  embeds_many :c, class_name: 'B'
end 

class B
  include Mongoid::Document
  embedded_in :a
end

>obj = A.create
=> #<A _id: 5743f10b0da757b22a1cfa69, >

> obj.b << B.new
=> [#<B _id: 5743f12f0da757b22a1cfa6a, >]

> obj.as_document
=> {"_id"=>BSON::ObjectId('5743f10b0da757b22a1cfa69'), "b"=>[{"_id"=>BSON::ObjectId('5743f12f0da757b22a1cfa6a')}]}

> A.find_by('b._id' => BSON::ObjectId('5743f12f0da757b22a1cfa6a'))
=> #<A _id: 5743f10b0da757b22a1cfa69, >

>obj.c << B.new
=> [#<B _id: 5743f2590da757b22a1cfa6b, >]

> obj.as_document
=> {"_id"=>BSON::ObjectId('5743f10b0da757b22a1cfa69'), "b"=>[{"_id"=>BSON::ObjectId('5743f12f0da757b22a1cfa6a')}], "c"=>[{"_id"=>BSON::ObjectId('5743f2590da757b22a1cfa6b')}]}