9

自動インクリメント フィールドが必要ですが、プライマリ ID には必要ありません。カスタマー サポート アプリケーションのユーザーに覚えやすいケース番号を提供するためだけです。

mongodb http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/で自動インクリメント フィールドを作成する方法を説明するこの記事を見つけましたが、このソリューションはまだ minimongo ではサポートされていません。

この機能を実装するにはどうすればよいですか? エラーが原因でソリューションが連続するケース番号をスキップしてもかまいませんが、ケース番号は一意である必要があります。

一意の短いケース番号を生成する別の方法はありますか? この PxyooJWSKc3sMz6Lc のようなケース コードをユーザーに提供したくありません。ケース番号で問題を参照する必要があるからです。

編集:

Minimong は findAndModify をサポートしていないため、投稿したリンクに記載されている最初のソリューションを使用できません。2 番目の解決策には、minimongo では利用できないメソッドも必要です。

4

2 に答える 2

12

mongo-counter パッケージを使用すると、メソッドでインクリメンタを作成できますincrementCounter(name)実装は、自動インクリメント シーケンス フィールドの作成に基づいており、Meteor コレクションを介さずにデータベースに直接アクセスします。

Meteor.methods({
    'addRecord':function(doc) {
        doc.id = incrementCounter('docId');
        MyCollection.insert(doc);
        return doc.id;
    }
});

アップデート

Atmosphere には新しい mongo カウンター パッケージがあり、おそらく私の最初の推奨よりも優れています。

于 2013-08-08T21:27:29.467 に答える
4

これを行うにはいくつかの方法があります。完全に一貫性が必要な場合は、現在の整数をコレクションに保存し、Meteor.call を使用してクライアントから行うのではなく、新しいレコードを追加できます。

例えば

サーバーサイドjs

Meteor.methods({
    'addRecord':function(doc) {
        currentId = MyCollection.findOne({},{sort:{id:-1}}).id || 1;
        doc.id = currentId + 1;
        MyCollection.insert(doc);
        return doc.id;
    }
});

クライアント側のjs

doc = {name:"Bob"}
//MyCollection.insert(doc)

//Use this instead
Meteor.call("addRecord", doc, function(err,result) {
    if(result) {
        console.log("Successfully added new record with auto_inc id " + result);
    }
}

ただし、Meteor.call でそれを行うと、1 つのことが失われます: レイテンシー補正です。

その他の可能性

Unix タイムスタンプから構築されたものを保存し、それをより適切なものに短縮することができます (たとえば、最初の数桁を切り取ることにより):

new Date().getTime().toString().substr(4)
于 2013-04-09T06:43:15.237 に答える