2016-04-12 10 views
2

私のAPIをParse.comから自分のExpress.jsコードに移行中です。私は構文解析によって作成されたデータベースと一致するように私のmongooseモデルを作成しましたが、私はポインタ(関係)に関する問題に走っています。ここでフィールドの部分文字列にpopulateを使用してMongooseを使用する

は、だからここに(可能な限り簡素化)二つのモデル

const CustomerSchema = new mongoose.Schema({ 
    _id   : { type: String, required: true, default:() => randomstring.generate(10) }, 
    name   : { type: String, required: true, trim: true }, 
    _p_group  : { type: String, required: true, trim: true, set: v => `Group\$${v}`, get: v => v.substr(6) }, 
}); 


const GroupSchema = new mongoose.Schema({ 
    _id   : { type: String, required: true, default:() => randomstring.generate(10) }, 
    name   : { type: String, required: true, trim: true }, 
}); 

ある問題である:_p_groupGroupへの「ポインタ」ですが、パースは、それにIDを格納しません、代わりに、店舗Group$THE_IDたとえば、お客様がID:ndj879gLjtのグループに所属している場合、_p_groupにはGroup$ndj879gLjtが含まれます。

どのように関係を処理できますか?顧客とそのグループを返却するにはどうすればよいですか?通常の方法は、_p_groupのオプションにref: "Group"を追加し、Customer.find({}).populate('_p_group')を実行することですが、明白な理由からここでは機能しません。

parseはmongodbを使用していますが(マングースではありません)、なんでかの方法が必要です。また、ソリューションはParseと互換性がなければなりません。最悪の場合、私はまだidを含む新しいフィールド_customerを作成することができますが、それは私が20Goのデータを更新するようにします。これは本当に私が望むものではありません。

答えて

-2

Parse Server source codeを見た後、は実際にはいくつかのリクエストを行っていると思われ、全部は使用しません。最初にクエリに一致するCustomersがすべて見つかった場合は、結果をループしてgroupIdのリストを取得し、Groupの場合は_id in [list of groupId]とクエリします。

+0

で動作するはずだと思いますか?それがパースが説明する方法ではない場合、それ以外の場合は有効な答えです。それは "すてきで清潔な"答えではありませんが、それは現在Parseで現在作業している方法であり、人々は知りたいと思うかもしれないし、同じことをしたいかもしれません。 – Melvin

-1

あなたのタイプはmongoose.Schema.ObjectIdであるべきですので、ObjectIdが格納され、プロパティーrefは、参照するコレクションの名前にする必要があります。

私は地獄で、私はdownvoteを取得していますなぜ次はpopulate

const CustomerSchema = new mongoose.Schema({ 
    _id   : { type: String, required: true, default:() => randomstring.generate(10) }, 
    name   : { type: String, required: true, trim: true }, 
    _p_group  : { type: mongoose.Schema.ObjectId, ref: 'Group', required: true, trim: true }, 
}); 
+0

完璧な世界では、それは可能ですが、 '_p_group'はParseによって設定され、(特殊な)' String'が入ります。型を 'ObjectId'に変更すると、Parseとの互換性が損なわれます。私はすでにデータベースに何百万もの行を持っています。タイプを簡単に変更することはできません。 – Melvin

+0

ああ。 'Customer.find()。populate( '_ p_group'、null、 'Group')'のように 'ref'を渡すことができますが、' _id'の 'Group $'その前に。私は実行の順序については分かりませんが、おそらく 'CustomerSchema.post( 'find'、function(r、n){r = r.map(function(a){a._id.replace IDを処理するには、それを呼び出す前に呼び出されるかどうかは分かりませんが、ちょうど推測してください。 – mani

+0

良い考えですが、残念ながらそれはありません。 'post'は実際に' _p_group'に設定されたゲッターの後に呼び出されます。 – Melvin

関連する問題