Как отфильтровать документ mon go на основе вложенного объекта? - PullRequest
1 голос
/ 05 апреля 2020

Как я могу найти комнату по идентификатору и убедиться, что в комнате находится текущий игрок?

У моего mongodb есть документ о комнатах, в котором есть игроки, и игрок является пользователем.

const RoomSchema = new Schema({
  players: [{ type: Schema.Types.ObjectId, ref: "Player" }]
})

const PlayerSchema = new Schema({
  user: { type: Schema.Types.ObjectId, ref: "User" }
})

const UserSchema = new Schema({
  username: { type: String}
})

Я хочу найти комнату, где id === roomId и комната имеет игрока с user._id === userId

Мой запрос пока только находит одну комнату по ID, но я хочу сделать уверен, что в возвращенной комнате есть текущий пользователь в качестве игрока

RoomModel
  .findOne({_id: roomId})
  .populate({ 
    path: 'players',
    populate: {
      path: 'user',
      model: 'User',
      select: ["_id", "username"]
    }
  })

1 Ответ

2 голосов
/ 05 апреля 2020

Вы можете использовать структуру агрегации mongodb для этой задачи.

Playground

const result = await RoomModel.aggregate([
  {
    $match: {
      _id: "1",  // match by room id
    },
  },
  {
    $lookup: {
      from: "players",   // must be physical collection name, check if different
      localField: "players",
      foreignField: "_id",
      as: "players",
    },
  },
  {
    $unwind: "$players",
  },
  {
    $match: {
      "players.user": "100", //match by user id
    },
  },
  {
    $lookup: {
      from: "users",
      localField: "players.user",
      foreignField: "_id",
      as: "user"
    }
  }
]);

if (result.length > 0) {
  console.log("found"); //todo: add your logic when found
} else {
  console.log("not found"); //todo: add your logic when not found
}

Это даст такой результат, когда пользователь найдет, вам может понадобиться некоторые преобразования.

[
  {
    "_id": "1",
    "players": {
      "_id": "10",
      "user": "100"
    },
    "user": [
      {
        "_id": "100",
        "username": "user1"
      }
    ]
  }
]
...