1

Express と Monk を使用して、書き込みが主に Meteor アプリケーションによって処理されるデータベースに接続する API を構築しています。

Meteor が独自のアルゴリズムを使用して ID を生成していることは知っています。だから私がそのようなことをするとき:

id = "aczXLTjzjjn3PchX6" // this is an ID generated by Meteor (not a valid MongoID)

Users.findOne({ _id: id }, function(err, doc) {
    console.log(doc);
});

僧侶の出力:

Argument passed in must be a single String of 12 bytes or a string of 24 hex characters.

このように、堅牢で信頼性の高い REST API を設計するのは非常に難しいように思えます。したがって、2 つの質問があります。

  1. Meteor によって生成された ID と有効な MongoID() の間のクエリの違いを処理するにはどうすればよいですか? Meteor データベースから JSON 結果を取得する簡単な方法はありますか?

  2. 今回は有効な MongoId() を持つ API からドキュメントを挿入することは問題になりますか? データベースに両方のタイプの ID が存在することになり、非常に悪いように思えます。:/

4

2 に答える 2

2

ここで述べたように、同様の問題で、monk の id コンバーター部分をオーバーライドできます。

var idConverter = Users.id; // Keep a reference in case...
Users.id = function (str) { return str; };

しかし、monk が ID を自動的に変換するとは思わないでください。

Meteor によって生成された ID と有効な MongoID() の間のクエリの違いを処理するにはどうすればよいですか? Meteor データベースから JSON 結果を取得する簡単な方法はありますか?

あなたがする必要があることは何もありません。それが有効な ObjectId(mongo db ids) であり、文字列を取得した場合は、それをオブジェクト ID に変換するだけです。

id = ObjectId(id);
User.find(id, ...)

monk id メソッドの実装は次のとおりです (this.col.id は mongodb ネイティブ ObjectId への参照です)。

Collection.prototype.id =
Collection.prototype.oid = function (str) {
  if (null == str) return this.col.id();
  return 'string' == typeof str ? this.col.id(str) : str;
};

今回は有効な MongoId() を持つ API からドキュメントを挿入することは問題になりますか? データベースに両方のタイプの ID が存在することになり、非常に悪いように思えます。:/

悪いです。注意すれば、(nodejsでの私の経験では)それほど問題は発生しませんが。しかし、常に注意を払っているわけではありませんが (プログラマーのエラーはよく発生します)、対処可能です。静的言語 (Java など) では、フィールドは 1 つの型 (文字列または ObjectId) しか使用できないため、これは大きな NO です。

私の提案は、mongodb ObjectId をまったく使用せず、文字列を ID として使用することです。挿入時に文字列 _id を与えるだけなので、ドライバーは ObjectId を与えません。pkFactory をオーバーライドすることでドライバーの動作を停止できますが、monk を使用するのは簡単ではないようです。

もう 1 つのことは、monk は積極的に維持されておらず、mongodb の上の薄い層にすぎないということです。私の経験では、複数のコレクションがあり、大規模で複雑なコードベースのマングースを使用する方がはるかに優れています。

于 2014-09-17T15:56:33.817 に答える