我正在建立一个分析系统,API调用将提供唯一的用户ID,但它不是按顺序而且太稀疏。
我需要为每个唯一用户ID提供一个自动增量ID,以在bitarray / bitset中标记分析数据点。因此,第一个用户遇到的对应于比特阵列的第一个比特,第二个用户将是比特阵列中的第二个比特,等等。
那么在MongoDB中生成增量唯一用户ID有一种可靠而快速的方法吗?
mongo中的每个对象都有一个id,它们按插入顺序排序。获取用户对象的集合,迭代它并将其用作递增的ID有什么问题?呃完全去那种地图减少工作
如选择的答案所示,您可以使用findAndModify生成顺序ID。
但我强烈反对你不应该这样做的意见。这一切都取决于您的业务需求。具有12字节ID可能非常消耗资源并且在将来导致显着的可伸缩性问题。
我有详细的答案here。
我知道这是一个古老的问题,但我会为后人发布我的答案......
这取决于您正在构建的系统以及适当的特定业务规则。
我正在MongoDb,C#(Backend API)和Angular(前端Web应用程序)中构建中到大规模的CRM,并发现ObjectId在Angular Routing中用于选择特定实体非常糟糕。与API控制器路由相同。
上面的建议对我的项目非常有效。
db.contacts.insert({
"id":db.contacts.find().Count()+1,
"name":"John Doe",
"emails":[
"[email protected]",
"[email protected]"
],
"phone":"555111322",
"status":"Active"
});
它适用于我的情况,但不是所有情况的原因是,正如上面的评论所述,如果从集合中删除3条记录,则会发生冲突。
我的业务规则规定,由于我们内部的SLA,我们不允许删除通信数据或客户记录超过我正在编写的应用程序的潜在生命周期,因此,我只是用枚举“状态”标记记录这是“活动”或“已删除”。你可以从用户界面中删除一些内容,它会说“联系人已被删除”,但所有应用程序已经完成的是将联系人的状态更改为“已删除”,当应用程序调用存储库以获取联系人列表时,我会过滤在将数据推送到客户端应用程序之前删除记录。
因此,db.collection.find()。count()+ 1对我来说是一个完美的解决方案......
它不适用于所有人,但如果您不删除数据,它可以正常工作。
应该添加第一条记录
"_id" = 1 in your db
$database = "demo";
$collections ="democollaction";
echo getnextid($database,$collections);
function getnextid($database,$collections){
$m = new MongoClient();
$db = $m->selectDB($database);
$cursor = $collection->find()->sort(array("_id" => -1))->limit(1);
$array = iterator_to_array($cursor);
foreach($array as $value){
return $value["_id"] + 1;
}
}