ブログを構築していた場合は、ブログタイトルを一意の識別子として使用してURLを解析することができます。しかし、もし私が数字を使いたければどうでしょうか?あなたはTwitterがどのようにwww.twitter.com/username/statuses/9834542を持っているか知っていますか?誰もがこの仕事をする良い方法を考え出しましたか? "_id"を使っているのは時間がかかりすぎているからです。mongodbの一意のID
答えて
一意性を保証できる限り、デフォルトの "_id" MongoDBサプライを使用することに制約はありません。
したがって、この番号をどのように生成するかはあなた次第です。この番号をMongoDBの中に保存したいのであれば、それを別のコレクションに保存し、必要な新しいURLごとにそれを増やすことができます。
the $inc
verbを使用してフィールドをインクリメントするか、MongoDBがatomically updateをどのように使用できるかを調べるか、値を増分したい場合があります。
アランが言ったように、あなたは自分のIDを提供することができます。だから問題は、それを独自に生成する方法です。このシーケンスサーバーはシーケンスごとに単一のモンゴレコードを使用することができます –
MongoDBの独自のフィールドに一意制約を追加する場合は、インデックスを使用します。次に、番号を生成して一意性をテストする任意のハッシングアルゴリズムを使用できます。 MongoDBのドキュメントの例では、他の文書と同じ姓と名で文書を挿入を防止することができます
db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
です。
さらに詳しい情報はdocumentationでご覧になれます。
私はデータを収集 '配列' を作成することで、この問題を解決した:
- 名
- currurt値
私はMorhpiaを使用して、それのためのDAOを持っています。しかし、あなたはMorhpiaなしでもそれを行うことができます。 アイデアは$ atomicを使用することです(おそらく、1インスタンスのみの更新で省略できます)。$inc修飾子演算子です。 SequenceDAO上
シーケンス
@Entity(value = "sys_sequence", noClassnameStored = true)
public class SequenceM {
/**
* Names of entity
*/
public static enum Entity {
USER,
CAPABILITY_HISTORY;
public String getEntityName() {
return this.name().toLowerCase();
}
}
@Id
private ObjectId uid;
@Property
@Indexed(unique = true)
private String name;
@Property
private Long value;
//..getters/setters/etc
}
方法:
@NotNull
public Long nextValue(final @NotNull SequenceM.Entity entity) {
final DB db = this.ds.getDB();
final WriteConcern writeConcern = getWriteConcern();
//optimization for JVM instance
synchronized(entity) {
do {
SequenceM sequence = findOne("name", entity.getEntityName());
final DBObject q = BasicDBObjectBuilder.start().add("name", entity.getEntityName()).add("value", sequence.getValue()).add("$atomic", 1).get();
final DBObject o = BasicDBObjectBuilder.start().add("$inc", BasicDBObjectBuilder.start().add("value", 1).get()).get();
WriteResult writeResult = db.getCollection("sys_sequence").update(q, o, false, true, writeConcern);
if(writeResult.getN() == 1) {
return sequence.getValue() + 1;
}
} while(true);
}
}
/**
* Determining writing concern basing on configuration
*/
private WriteConcern getWriteConcern() {
return isOneNodeOnly ? WriteConcern.SAFE : REPLICATION_SAFE;
}
のMongoDBの構成に応じて(1つのノードのみ、またはマスタ/スレーブまたはレプリカセット)あなたは正しいWriteConcernを使用する必要があります。 1つのインスタンスで1つの環境でREPLICATION_SAFEを使用すると、無限ループが発生します。
これはどの言語ですか:)ヒットマイ眼! – asyncwait
findandmodifyコマンドを使用して実行できます。
> db.runCommand({ "findandmodify" : "sequences", "query" : { "name" : "postid"}, "update" : { $inc : { "id" : 1 }}, "new" : true });
は、このコマンドは、アトミックに更新返します。
、あなたがこのようなコードを使用することができますのは、私たちがsequences
という名前の特別なコレクションを持って考えると、私たちは(postid
という名前)郵便番号の列を持ちたいです(new
)のドキュメントをステータスとともに表示します。 value
フィールドには、コマンドが正常に完了した場合に返されるドキュメントが格納されます。
シャード環境ではどのようにしてこの作品を制作しますか? – BlitzKrieg
@BlitzKrieg、ドキュメントごと: "* findandmodify *は、変更対象のコレクションが非共有である限り、mongosを通じて呼び出されたときと同じように動作します。コレクションがシャードされている場合、クエリにはシャードキーが含まれている必要があります。ですから 'sequences'コレクションを破棄しないでください。 –
これは@Hubert ...ありがとう! – BlitzKrieg
技術的には、ID番号が大きすぎて短縮することはできません。しかし、戦術を埋めることができます。これは、16進数から英数字への変換で、文字数を減らし、Urlでより美しく見えます。私は本当にうまくいきました...ここには
function encode(hex) {
return new Buffer(hex, 'hex').toString('base64').replace('+', '-').replace('/', '_');
};
function decode(NoHex) {
return new Buffer(NoHex.replace('-','+').replace('_','/'), 'base64').toString('hex');
};
IdString= MyDoc._id.toString();
Idencode = encode(IdString) // 16 Caracters a-Z and 0-9
console.log(IdEncode); //You see That 'aqswedasdfdsadsf'
IdDecode = decode(IdEncode);
IdDecode === IdString // Is true!!!
もちろん、この技術は同じid、mongoを使用します。
- 1. クライアントマシン一意のID
- 2. 一意のファイルID?
- 3. IDの一意性
- 4. アンドロイドアクティビティの一意のID
- 5. mysqlの一意のID
- 6. データベース内の一意のID
- 7. Corba - 一意のユーザID
- 8. 一意のID検証クエリ
- 9. AMI、スナップショットID、インスタンスIDの一意性
- 10. MongoDBで一意のユーザーIDのシーケンスを格納するための自動インクリメント
- 11. マシン(システムユーザアカウント)のユーザアカウントの一意のID?
- 12. Androidの各ユーザーの一意のID
- 13. Windows CEデバイスの一意のマシンID
- 14. PostgreSQL 9.4テーブルの一意のID
- 15. Googleリーダーのフィード一意のID
- 16. 親と子のテーブル一意のIDフィールド
- 17. ファイル名の一意のIDです。
- 18. 雲で一意のIDを生成
- 19. Twitter API:一意のIDと電子メールアドレス?
- 20. XML要素一意のIDスキーマrepersentation
- 21. グローバルに一意の場所ID
- 22. 一意のIDを持つ部分ビュー
- 23. PaypalのトークンIDが一意ですか?
- 24. NodeJS Express - グローバル一意の要求Id
- 25. MySQL。リレーショナル表の主キー。一意のIDまたは複数の一意のキー?
- 26. アンドロイドのアプリIDとデバイスIDを組み合わせた一意のID
- 27. MongoDBマップによる一意の値の集約
- 28. oozieワークフロージョブIDは一意ですか?
- 29. ASP.NETセッションID - サーバー間で一意です
- 30. mongoDB 3.2の一意索引NULL値を無視
URLのmd5(または任意の)ハッシュを実行して、_idの場所に格納することができます。 –