我有一个集合,其中一些文档在一个组中。
例如,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?
答案 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以及要为每个组存储的任何其他信息。