2017-12-08 7 views
0

私が達成しようとしているのは、お互いを照合することです。 この動作を実現するには、ユーザーの一致する配列にドキュメントを埋め込みます。Mongoose:埋め込まれた文書とユーザーIDを一致

相続人は私のUserモデル

const mongoose = require('mongoose'); 
const Schema = mongoose.Schema; 

const Match = new Schema({ 
    with: {type: Schema.Types.ObjectId, ref: 'User'}, 
    near: {type:String}, 
    createdAt: {type:Date, default: Date.now} 
}); 


const UserSchema = new Schema({ 
    name: { type: String, default: '' }, 
    surname: { type: String, default: '' }, 
    email: { type: String, default: '', }, 
    salt: { type: String, default: '' }, 
    hashed_password: { type: String, default: '' }, 
    interested: { type: [String] }, 
    about: { type: String }, 
    createdAt: {type:Date, default:Date.now}, 
    devices: {type: [String]}, 
    matches: [Match] 
}); 

しかし、信頼性の高いアプリケーションロジックのため

、 ユーザーは二回マッチしてはいけません。私の計画では、一致する配列内に一致する人物を一緒に挿入します。

たとえば、

User A 
_id: 123 
matches: [{with: 456,near:California,createdAt:someDateTime}] 

User B 
_id: 456 
matches: [{with: 123,near:California,createdAt:someDateTime}] 

マッチが発生する前に、私は、ユーザーのいずれかが前にマッチしたかどうか、それはatomicでなければならないかどうかを制御する必要があります。

ありがとうございました。

答えて

0

多分これは動作します:

const Match = new Schema({ 
    matchedIds: [ {type:string} ] 
    near: {type:String}, 
    createdAt: {type:Date, default: Date.now} 
}); 

のでmatchedIdsはちょうど2つのユーザーIDが含まれています。それでは、一致するものを見つけることができます:

db.match.find({ matchedIds: { $all: ["UserID 1", "UserID 2"] } }) 
+0

しかし、それはモデルまたはスキーマそのものではなく、埋め込まれたドキュメントです。どのように私はそれをクエリすることができますか? –

+0

@AlicanYilmaz申し訳ありませんが、私は速すぎました。自分のコレクションにマッチを保存する方が簡単ですか?両方のユーザーから参照でき、1人のユーザーが一致を元に戻すことを決定した場合は、参照を自動的に削除することができます。 – smiggle

+0

私の最近のデザインはそうだった、私は別々のコレクションで試合を集めていた。しかし、その場合、大きな問題があります。クエリが同時に実行されると、一致コレクションのsave()が同時に2回実行されます。これは、不整合の大きな問題に頼っています。ここでそれに従うことができます。 https://stackoverflow.com/questions/47718970/mongoose-atomic-save?rq=1 –

関連する問題