如果数组包含id mongoose,则获取数组

时间:2016-08-23 21:23:42

标签: arrays node.js mongodb mongoose mongoose-schema

这是一个棘手的问题。我以为我可以使用$ 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,如果播放器数组包含此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);
        }
    });
};

1 个答案:

答案 0 :(得分: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分开而不是链接所有数组方法,试图提高可读性。