从文档的唯一ID设置自己的MongoDB_id是一种不好的做法吗?



我正在接收并存储一个JSON对象数组,如下所示:

$json_assoc_array = array (
{
'id' => "unique-id-1",
'key_one' => "some value",
'key_two' => "some value",
'key_three' => "some value"
},
{
'id' => "unique-id-2",
'key_one' => "some value",
'key_two' => "some value",
'key_three' => "some value"
},
{
'id' => "unique-id-3",
'key_one' => "some value",
'key_two' => "some value",
'key_three' => "some value"
}
); 

稍后我将以相同的格式接收这些对象的更新。 我需要按其id字段更新对象/文档。

当我使用简单的insertMany将它们插入MongoDB时,它们也会获得唯一的MongoDB对象_ids,因此生成的文档如下所示:

$json_assoc_array = array (
{
'_id' => "5b824c113e2ffc4e7239bfc5"
'id' => "unique-id-1",
'key_one' => "some value",
'key_two' => "some value",
'key_three' => "some value"
},
{
'_id' => "5b824c1b3e2ffc4e7239caa2"
'id' => "unique-id-2",
'key_one' => "some value",
'key_two' => "some value",
'key_three' => "some value"
},
{
'_id' => "5b824c1b3e2ffc4e7239caa3"
'id' => "unique-id-3",
'key_one' => "some value",
'key_two' => "some value",
'key_three' => "some value"
}
); 

IDunique-id-1永远不会有另一个文档。 因此,我现在在最初插入它们之前设置它们,如下所示:

$json_assoc_array = json_decode($data, true);
// Set order MongoDB _id
$json_assoc_array['_id'] = $json_assoc_array['id'];
// Set MongoDB collection
$collection = $mongo->mongo_db_name->collection;
// Insert documents into MongoDB
$result = $collection->insertMany( $json_assoc_array );
// Now when I insert the above documents, they result in this
$json_assoc_array = array (
{
'_id' => "unique-id-1"
'id' => "unique-id-1",
'key_one' => "some value",
'key_two' => "some value",
'key_three' => "some value"
},
{
'_id' => "unique-id-2"
'id' => "unique-id-2",
'key_one' => "some value",
'key_two' => "some value",
'key_three' => "some value"
},
...
); 

有什么理由说明这是不好的做法吗?

我是否应该将_id留给MongoDB设置,并使用id字段更新现有文档?

除了_id是不可变的事实之外,您还可以使用任何您想要的数组柱。

它甚至可能对您有利。使用精心设计的索引和查询,您可能能够从索引交集(查询中使用多个索引(中受益。这本身就为您提供了更多有效建模数据的选项,但让我们暂时搁置这方面。更有趣的一点是,如果您只需要索引覆盖的文档字段的子集,则可以使用您无法避免的索引使相应的查询"覆盖"(仅从索引中回答,通常保存在RAM中(。

tl;dr:ObjectId 只是一个结构,能够在您的数据不提供全局唯一标识符的情况下提供全局唯一标识符。使用具有语义价值的东西而不是 ObjectId 是我个人认为的最佳实践

相关内容

最新更新