2017-01-30 8 views
0

との簡単なネストされたクエリ基本的に私はチャットアプリケーションを開発しています。このmongooseスキーマは、2人のユーザー間のプライベートチャット用のスキーマを表します。

私がしようとしているのは、クライアント から与えられたid1とid2がプライベートチャットdbのコレクションに含まれているかどうかを確認することです。問題は、このmongoDBクエリが正しく動作せず、これらのユーザーIDがチャットドキュメントに既に存在する場合です。今度は逆のuser1とuser2の同じ_idを持つ新しいチャットドキュメントが作成されます。ザッツなぜ$orオペレータを必要とするが、私はこれが2人のユーザー間のこの関係はすでに存在しているかどうかを確認するために私の実装です

const chatSchema = new Schema({ 

     user1: { 

      _id: String, 
      username: String, 
      fullName: String 
     }, 
     user2: { 

      _id: String, 
      username: String, 
      fullName: String 
     }, 
     messages: [ 
      { 
       _id: false, 
       author: String, 
       text: String, 
       date: Number 
      } 
     ] 

    }); 

を意図したとおり、私のクエリは動作しません。存在する場合は、文書を作成せずに保存してください。 data.user._idはユーザーのIDを表し、data.friend._idはチャットしているユーザーのIDを表します。

Chat.count(
     { 
      $or: [ 
       { 
        user1: { 
         _id: data.user._id 
        }, 
        user2: { 
         _id: data.friend._id 
        } 
       }, 
       { 
        user2: { 
         _id: data.user._id 
        }, 
        user1: { 
         _id: data.friend._id 
        } 
       } 
      ] 
     }, (err, count) => { 
      if (!count) { 
       new Chat({ 
        user1: data.user, 
        user2: data.friend, 
        messages: [] 
       }).save((err, data) => { 
        if (err) { 
         console.log(err); 
        } 
        socket.join(data._id); 
        socket.emit('chats', data); 
       }); 
      } 
     }); 

答えて

1

$または演算子内でのクエリには、MongoDB dot notationを使用する必要があります。

あなたの$やドキュメントを1として

{ 
     $or: [ 
      { 
       "user1._id": data.user._id,      
       "user2._id": data.friend._id      
      }, 
      { 
       "user2._id": data.user._id,      
       "user1._id": data.friend._id  
      } 
     ] 
    } 

でこれを試してください: -

ドットが埋め込まれた文書名を連結し、ドット表記が埋め込まれた文書のフィールドを指定するか、またはアクセスするには(。)とフィールド名を入力し、引用符で囲みます。

+1

さらに、同じ$または条件のCountではなくfindOneを使用することをお勧めします。同じifステートメントが適用されます(エラーまたは返されたdocのいずれか、または存在しない場合はどちらも存在しません)。しかし、新しいデータをmessages配列に追加できるように、ソケットの既存のインスタンスdocを返すことができます。 – SylonZero

+0

まさに私が感謝したこと –

関連する問題