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

时间:2014-03-03 19:25:47

标签: mongodb primary-key

我们的(edX)原始Mongo持久性表示使用bson字典(aka对象或子文档)作为_id值(请参阅mongo/base.py)。此ID缺少字段。

  1. 某些文档“_id值是否比其他文档的子字段更多而没有完全搞砸索引?”
  2. 在没有附加字段的情况下处理现有文档的最佳方法是什么?删除并更换它们?尝试使用新的_id格式进行查询,如果失败则无法查询新字段?尝试在一个查询中使用新的_id格式进行查询?
  3. 更具体地说,当前格式是

    {'_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': the_session_or_term_for_course_run'course_id': org/course/run

1 个答案:

答案 0 :(得分:2)

集合中的文档不需要具有相同结构的_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的“值”的完全匹配才会返回文档。因此,这不会返回上述集合的文档:

db.foo.find({_id:{c:1}})

因此,对于您的情况,欢迎您向对象添加字段,该字段是_id键的值。并且所有文档都具有不同的结构并不重要。但是,如果您希望查询集合by_id并使其高效,则需要为可能单独使用的所有相关子部件添加索引。这不是超级有效的。

_id与此方面的任何其他关键词没有什么不同。