2016-08-23 5 views
1

これはトリッキーなものです。私は$ inを使うことができると思っていましたが、質問した後、私が探していた場所ではありませんでした。配列にidが含まれている場合に配列を取得する

これは、(配列が常に意志他のIDを返し、プレイヤーの配列は、このIDが含まれている場合、私は、ユーザーIDを送って、私が作るしようとしている要求は以下の通りです私のスキーマ

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] 
}); 

です配列内に長さ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); 
     } 
    }); 
}; 

答えて

1

ので、「選手たちは、」アレイである必要があり、それは私が返すようにしたいゲームではありませんあなたはこれを試すことができますか?

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の配列をしたいという仮定の下で動作しています。私はVARSではなく、配列のすべてのメソッドを連鎖の裂け保持読みやすさを向上させようとしています。

+0

これはうまくいくはずです。私はあなたが文字列などを照会するのと同じ方法で配列プロパティの特定の値を照会できると信じています。 – tetutato

+0

Yup。私の意見では少し奇妙です。私の最初の本能は '$ contains'演算子を使うことでしたが、私はそれがmongoに存在するとは思いません。 – dvlsg

+0

MongoDBのものを照会するのがどれほど簡単か気に入っています。 :) – tetutato

関連する問題