Mongodb 使用具有不同字段的对象(子文档)作为_id
我们的(edX)原始Mongo持久性表示使用bson字典(也称为对象或子文档)作为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
\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
的结构。如果具体有帮助,我会写更多的细节(实际的关键列表和问题)。另外,请注意,我在问题的第一段中链接了实际代码。