一意のユーザーIDのシーケンスを保存するためのMongoDBの自動増分
-
28-10-2019 - |
質問
私は分析システムを作成しています。API呼び出しは一意のユーザーIDを提供しますが、順番ではなく、あまりにもまばらです。
BitArray/Bitsetの分析データポイントをマークするには、各ユニークなユーザーIDに自動増分IDを提供する必要があります。したがって、最初のユーザーの出会いは、ビタレイの最初のビットに対応し、2番目のユーザーはBitArrayなどの2番目のビットになります。
それでは、MongoDBでインクリメンタルな一意のユーザーIDを生成するための堅実で高速な方法はありますか?
解決
できますが、そうすべきではありませんhttps://web.archive.org/web/20151009224806/http://docs.mongodb.org/tutorial/create-an-incrementing-field/
Mongoの各オブジェクトにはすでにIDがあり、挿入順序でソート可能です。ユーザーオブジェクトのコレクションを取得し、それを繰り返して、これをインクリメントIDとして使用することの何が問題になっていますか? Map-Reduceの仕事を完全に行います
他のヒント
選択した回答によると、FindAndModifyを使用してシーケンシャルIDを生成できます。
しかし、私はあなたがそうすべきではないという意見に強く反対します。それはすべてあなたのビジネスニーズに依存します。 12バイトIDを持つことは非常にリソース消費され、将来的に重大なスケーラビリティの問題を引き起こす可能性があります。
詳細な答えがあります ここ.
私はこれが古い質問であることを知っていますが、私は後世のために私の答えを投稿します...
それはあなたが構築しているシステムと、特定のビジネスルールに依存します。
MongoDB、C#(BackEnd API)、およびAngular(FrontEnd Webアプリ)に中程度から大規模なCRMを構築しており、特定のエンティティを選択するためのAngularルーティングで使用するのに非常にひどいオブジェクトを見つけました。 APIコントローラールーティングでも同じです。
上記の提案は私のプロジェクトで完全に機能しました。
db.contacts.insert({
"id":db.contacts.find().Count()+1,
"name":"John Doe",
"emails":[
"john@doe.com",
"john.doe@business.com"
],
"phone":"555111322",
"status":"Active"
});
私のケースに最適な理由は、すべてのケースではありません。上記のコメントが述べているように、コレクションから3つのレコードを削除すると、衝突が発生するからです。
私のビジネスルールは、私たちのHoush Hous SLAのために、私が書いているアプリケーションの潜在的な寿命よりも長い間通信データまたはクライアントレコードを削除することは許可されていないと述べています。 「アクティブ」または「削除」のいずれかです。 UIから何かを削除することができ、「連絡先が削除された」と表示されますが、アプリケーションが行ったすべてのアプリケーションは、連絡先のステータスを「削除」に変更し、アプリが連絡先のリストのRespositoryを呼び出すと、フィルターがあります。データをクライアントアプリにプッシュする前に、レコードを削除しました。
したがって、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;
}
}