との簡単なネストされたクエリ基本的に私はチャットアプリケーションを開発しています。この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);
});
}
});
さらに、同じ$または条件のCountではなくfindOneを使用することをお勧めします。同じifステートメントが適用されます(エラーまたは返されたdocのいずれか、または存在しない場合はどちらも存在しません)。しかし、新しいデータをmessages配列に追加できるように、ソケットの既存のインスタンスdocを返すことができます。 – SylonZero
まさに私が感謝したこと –