如何在MongoDB中插入一组具有唯一组ID的文档?

时间:2015-04-24 11:37:06

标签: mongodb

我有一个集合,其中一些文档在一个组中。

例如,2和3属于一个组:

{_id: 1, subject: "one",   groudId:  null}
{_id: 2, subject: "two",   groudId: "1234"} 
{_id: 3, subject: "three", groudId: "1234"}
{_id: 4, subject: "four",  groudId:  null}

目前,在创建组文档的同时创建groupId

我遇到的问题是我们项目的设计目前在客户端创建group_id,然后客户端将其发送到MongoDB。

我认为这会导致问题,两个客户端为两个不同的组生成相同的groupId。 特别是因为此时grouId是当前时间和客户端运行时间的串联。 (不要问我为什么,这不是我的主意。)

那么如何使用MongoDB为组创建唯一的ID?

我的第一个想法就是选择_id`` of the first task and make that the groupId`。 例如:

{_id: 1, subject: "one",   groudId:  null}
{_id: 2, subject: "two",   groudId:    2 } 
{_id: 3, subject: "three", groudId:    2 }
{_id: 4, subject: "four",  groudId:  null}

_id在插入时创建,因此我无法在插入时设置groudId并且必须稍后进行更新。

如果没有多次插入和/或更新,这是否可行? 或者是否有计划在客户端上创建唯一的组ID?

1 个答案:

答案 0 :(得分:2)

如果您可以更改生成groupId字段的方式,则可以始终使用MongoDB的ObjectId()作为标识符。生成重复的ObjectId标识符的可能性非常低,如this post中所述。然后,您可以让代码执行以下操作(使用mongo shell语法)。

// First Group
> var groupId = ObjectId();
> db.collection.insert({ "subject": "two", "groupId": groupId });
> db.collection.insert({ "subject": "three", "groupId": groupId });

// Second Group
> var groupId = ObjectId();
> db.collection.insert({ "subject": "one", "groupId": groupId });
> db.collection.insert({ "subject": "four", "groupId": groupId });

如果您想重复使用之前生成的groupId,可以从集合中获取它,然后重复使用它。

// Reuse First Group's ID
> var groupId = db.collection.findOne({ "subject": "two" })["groupId"];
> db.collection.insert({ "subject": "five", "groupId": groupId });  

作为附注,我个人更愿意拥有第二个集合groups,我会为每个组保留一份文档,并将该文档的_id作为{{1的标识符您其他集合中的字段。这样,您可以轻松跟踪每个组的ID以及要为每个组存储的任何其他信息。