Mongodb 使用具有不同字段的对象(子文档)作为_id

Mongodb 使用具有不同字段的对象(子文档)作为_id,mongodb,primary-key,Mongodb,Primary Key,我们的(edX)原始Mongo持久性表示使用bson字典(也称为对象或子文档)作为\u id值(请参阅)。此id缺少一个字段 一些文档的\u id值是否可以比其他文档拥有更多的子字段而不完全破坏索引 在没有附加字段的情况下,处理现有文档的最佳方法是什么?拆下并更换它们?尝试使用新的\u id格式进行查询,如果失败,是否使用新字段进行查询?是否尝试在一次查询中同时使用新旧\u id格式进行查询 更具体地说,当前的格式是 {'_id': { 'tag': 'i4x', // yeah, it

我们的(edX)原始Mongo持久性表示使用bson字典(也称为对象或子文档)作为
\u id
值(请参阅)。此id缺少一个字段

  • 一些文档的
    \u id
    值是否可以比其他文档拥有更多的子字段而不完全破坏索引
  • 在没有附加字段的情况下,处理现有文档的最佳方法是什么?拆下并更换它们?尝试使用新的
    \u id
    格式进行查询,如果失败,是否使用新字段进行查询?是否尝试在一次查询中同时使用新旧
    \u id
    格式进行查询
  • 更具体地说,当前的格式是

    {'_id': {
        'tag': 'i4x', // yeah, it's always this fixed value
        'org': your_school_x,
        'course': a_catalog_number,
        'category': the_xblock_type,
        'name': uniquifier_within_course
    }}
    

    我需要添加
    “run”:集合中的\u session\u或\u term\u用于\u course\u run
    “course\u id”:org/course/run
    文档不需要具有相同结构的\u id值。因此,在一个集合中包含以下文档是完全可以接受的:

    > db.foo.find()
    { "_id" : { "a" : 1 } }
    { "_id" : { "a" : 1, "b" : 2 } }
    { "_id" : { "c" : 1, "b" : 2 } }
    
    请注意,由于索引仅位于_id上,因此只有为_id指定值的查询才会使用该索引:

    db.foo.find({_id:1}) // will use the index on _id
    db.foo.find({_id:{state:"Alaska"}) // will use the index on _id
    db.foo.find({"_id.a":1})  // will NOT use the index on _id
    
    还请注意,只有与_id的“value”完全匹配才会返回文档。因此,这不会为上述集合返回任何文档:

    db.foo.find({_id:{c:1}})
    
    因此,对于您的情况,欢迎您向作为_id键的值的对象添加字段。所有文档都有不同的结构并不重要。但是,如果希望通过_id查询集合并使其高效,则需要为可能单独使用的所有相关子部分添加索引。这不是超高效的


    _在这方面,id与任何其他密钥没有区别

    问题不清楚。是否要更改您的
    \u id
    ?插入时,您不必提供
    \u id
    ,mongo将为您生成一个。我建议使用一个单独的
    \u id
    字段,并根据您想要的值创建一个唯一的索引——应该是唯一的行。虽然我同意新集合的最佳设计可能是使用ObjectId,但我有一个使用Object的现有大型集合(也称为python dicts)但我需要添加另一个字段:值对到任何新插入的文档中;因此,是的,我想至少为一些文档更改
    \u id
    的结构。如果具体有帮助,我会写更多的细节(实际的关键列表和问题)。另外,请注意,我在问题的第一段中链接了实际代码。