トリッキーなものです。$ inを使用できると思いましたが、クエリを実行したところ、探していた場所ではありませんでした。
これは私のスキーマです
var gameSchema = new mongoose.Schema({
state: {
type: String,
default: "invited"
},
finished: {
type: Boolean,
default: false
},
players: {
type: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'users'
}],
required: true,
},
scores: [scoreSchema],
chat : [chatSchema]
});
私が行おうとしているリクエストは次のとおりです。ユーザーIDを送信し、players配列にこのIDが含まれている場合は、配列内の他のID(配列の長さは常に2)を返します。
コンテキストは、以前にプレイしたことがある相手を検索できるということです。
これは私が持っていたものですが、「プレーヤー」は配列である必要があり、私が返したいゲームではないので、
exports.getFriends = function(id, cb){
gameSchema.find({ id: { "$in": "players"} }, function(err, games){
if(err){
return cb(err, null);
}
else{
return cb(null, games);
}
});
};
これを試すことができますか?
exports.getFriends = function(id, cb){
gameSchema.find({ players: id }, function(err, games) {
if (err) {
return cb(err);
}
const players = games.map(game => game.players);
const mergedPlayers = [].concat.apply([], players);
const mappedPlayers = mergedPlayers.map(String); // convert ObjectIds to strings for comparisons.
const idString = String(id);
const filteredPlayers = mappedPlayers.filter(player => player !== idString);
const uniquePlayers = filteredPlayers.filter((player, index, arr) => arr.indexOf(player) === index);
return cb(null, uniquePlayers);
});
};
渡したプレーヤーIDではない一意のプレーヤーIDの配列が必要であるという前提で操作しています。読みやすさを向上させるために、すべての配列メソッドをチェーンするのではなく、変数を分割したままにしました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加