2016-05-26 17 views
1

は私が文書の収集、教師と生徒の間で議論を管理する各1を持っていると言うマッチmessage
teacherLastMessageフィールドまたはstudentLastMessageフィールドをユーザーのどちらに応じて更新するかを探しています。フィールドに基づいて条件付きの更新、マッチを作るためにはMongoを伝える方法はあり条件付きのアップデートは、

return Promise.all([ 

    // if user is teacher, set teacherLastMessage 
    db.collection('discussions').findOneAndUpdate({ 
     teacherId: userId, 
     _id 
    }, { 
     $set: { 
      teacherLastMessage: message 
     } 
    }, { 
     returnOriginal: false 
    }), 

    // if user is student, set studentLastMessage 
    db.collection('discussions').findOneAndUpdate({ 
     studentId: userId, 
     _id 
    }, { 
     $set: { 
      studentLastMessage: message 
     } 
    }, { 
     returnOriginal: false 
    }) 


]).then((results) => { 
    results = results.filter((result) => result.value); 

    if (!results.length) { 
     throw new Error('No matching document'); 
    } 

    return results[0].value; 
}); 

:現時点では

、私はこれを持っていますか?このようなもの:

db.collection('discussions').findOneAndUpdate({ 
    $or: [{ 
     teacherId: userId 
    }, { 
     studentId: userId 
    }], 
    _id 
}, { 
    $set: { 
    // if field matched was studentId, set studentLastMessage 
    // if field matched was teacherId, set teacherLastMessage 
    } 
}); 

確かにmongo 3.2では可能でしょうか?

+1

これは不可能に一つだけのクエリを使用してこれを行うには - だから

if(student) { var updateObj = { studentLastMsg: msg } } else { var updateObj = { teacherLastMsg: msg } } 

は、その後、私はこのスニペット作ってあげる$set{updateObj}のために、あなたの更新を渡します。データ構造を変更する必要があります。教師と学生のために別々のオブジェクトを作成します。この方法では、1つのクエリを使用して更新することができます。 – Shrabanee

答えて

1

$setの内部の他のフィールドを参照する必要があります。これは現在不可能です。例としてthis ticketを参照してください。

まず、2つの更新クエリを使用するあなたの現在のアプローチは、私にはうまく見えます。これを引き続き使用することができます。正しいインデックスが適切に配置されていることを確認してください。

  • { _id: 1, teacherId: 1 }
  • { _id: 1, studentId: 1 }:つまり、これらの更新のための最高のパフォーマンスを得るには、次の2つの複合インデックスを持つ必要があります。

これを別の観点から見ると、おそらくデータを再構成する必要があります。例:

{ 
    _id: '...', 
    users: [ 
     { 
      userId: '...', 
      userType: 'student', 
      lastMessage: 'lorem ipsum' 
     }, 
     { 
      userId: '...', 
      userType: 'teacher', 
      lastMessage: 'dolor sit amet' 
     } 
    ] 
} 

これにより、単一のクエリで更新を実行できます。

1

あなたのデータ構造は、ユーザーが先生と学生の両方ができ、その後あなたの構造を保つことができない限り、データを成形する必要がある特定のビジネスケースがない限り少し奇妙です。

$set{} paramはオブジェクトを取ることができます。私の提案は、事前にビジネスロジックを行うことです。更新が先生や学生のためになる場合は、更新の前に既に知っているはずです。教師と生徒を区別するために、ある種の変数を設定する/認証レベルを設定する必要があります。おそらく、コールバックのログインに成功すると、Cookie /ローカルストレージを設定できます。それにもかかわらず、現在のタイプのユーザーがいる場合は、事前にオブジェクトを作成できます。そのため、ユーザーのタイプに基づいて必要なプロパティを持つオブジェクトリテラルを作成します。モバイル

+0

私のユーザは、ディスカッションによって「生徒」または「教師」になることがあります。場合によっては、ドキュメントを更新する前に自分の役割を識別することができません。だから私は可能な場合は2つのクエリやデータの再構築に行くつもりです。 – seven11