27

meteor アプリの基になる mongodb に 2 列の一意のインデックスを作成しようとしていますが、問題があります。流星のドキュメントには何も見つかりません。Chromeコンソールから試しました。私は用語から試してみましたが、 .meteor 内の /db/ dir に mongod を向けようとさえしました。私が試してみました

Collection.ensureIndex({first_id: 1, another_id: 1}, {unique: true});バリエーション。

meteor アプリの mongo コレクションで重複エントリを防止できるようにしたい。

誰かがこれを理解したのだろうか?

私は自分の質問に答えました。

私はそれを考え出した。

  1. メテオサーバー起動

  2. 2番目のターミナルを開いて入力しますmeteor mongo

次に、インデックスを作成します...たとえば、サムズアップおよびサムズダウン型システムのレコードに対してこれらを行いました。

db.thumbsup.ensureIndex({item_id: 1, user_id: 1}, {unique: true})
db.thumbsdown.ensureIndex({item_id: 1, user_id: 1}, {unique: true})

ここで、手動ではなく、製品にプッシュされたときにこれらを作成するブートストラップ インストール セットアップを理解する必要があります。

4

4 に答える 4

31

Collection._ensureIndex(インデックス、オプション)

Meteor のソース コード内を検索すると、ensureIndexと呼ばれるバインドが見つかりました_ensureIndex。単一キーの基本的なインデックスの場合packages/accounts-base/accounts_server.js、Meteor で一意のユーザー名を強制する例に従うことができます。

Meteor.users._ensureIndex('username', {unique: 1, sparse: 1});

マルチキー「複合」インデックスの場合:

Collection._ensureIndex({first_id:1, another_id:1}, {unique: 1});

前のコードをサーバー側に配置すると、インデックスが確実に設定されます。

警告

_ensureIndex 実装の警告に注意してください。

後で実際にインデックス API を設計します。今のところ、Mongo にパススルーするだけですが、同期させます。

于 2012-11-06T19:45:05.830 に答える
15

ドキュメントによると、「Minimongo には現在インデックスがありません。これはすぐに利用できるようになります。」コレクションで利用可能なメソッドを見ると、ensureIndex.

mongo シェルを実行meteor mongoしてサーバー側のインデックスを有効にすることはできますが、Collection オブジェクトはそれらについてまだ認識していません。そのため、アプリではコレクション キャッシュに複数のインスタンスを追加できますが、サーバー側では、追加の挿入はサイレントに失敗します (エラーは出力に書き込まれます)。ハードページの更新を行うと、アプリはサーバーと再同期します

したがって、現時点での最善の策は、おそらく次のようなことです。

var count = MyCollection.find({first_id: 'foo', another_id: 'bar'}).count()
if (count === 0)
    MyCollection.insert({first_id: 'foo', another_id: 'bar'});

これは明らかに理想的ではありませんが、問題なく動作します。サーバー上の mongodb でインデックス作成を有効にすることもできるため、競合状態が発生した場合でも、実際には重複レコードを取得することはありません。

于 2012-04-16T03:14:04.370 に答える
1

実際には、Meteor.method を使用してサーバーで upsert を使用してみませんか。また、ts で追跡を送信することもできます: // サーバーのみ

Meteor.methods({
 add_only_once = function(id1,id2){
   SomeCollection.update(
     {first_id:id1,another_id:id2},{$set:{ts:Date.now()}},{upsert:True});
 }
});

// クライアント

Meteor.call('add_only_once',doc1._id, doc2._id);

// サーバー上で実行されている実際のコード

if(Meteor.is_server) {
    Meteor.methods({
        register_code: function (key,monitor) {
             Codes.update({key:key},{$set:{ts:Date.now()}},{upsert:true});
        }
     ...
于 2012-06-07T18:13:04.050 に答える