Мне нужно найти повторяющиеся записи определенного значения в массиве объектов в базе данных Mongo. Моя структура выглядит примерно так:
type gameTemplate struct {
ID bson.ObjectId `bson:"_id" json:"id"`
GameCode string `bson:"gamecode" json:"gamecode"`
Players []player `bson:"players" json:"players"`
}
type player struct {
PlayerID bson.ObjectId `bson:"playerid" json:"playerid"`
Username string `bson:"username" json:"username"`
}
Если к игре присоединяется новый игрок, я хочу убедиться, что его имя пользователя не занято. Я использовал этот метод для проверки повторяющихся кодов игры (если count
больше 1, я знаю, что игра существует):
count, err := collection.Find(bson.M{"gamecode": entry.GameCode}).Limit(1).Count()
Что работает хорошо, но, очевидно, не сработает для проверки значения username
объекта в массиве плееров. Я думаю, мне нужно было бы сделать что-то вроде проверки размера массива и перебора каждой опции, чтобы найти дубликат, но у меня не было никакого успеха.
РЕДАКТИРОВАТЬ
Я использую последнюю версию MongoDB и использую драйвер mgo.v2 на ходу. Поток того, чего я пытаюсь достичь, выглядит примерно так:
Player Y wants to join game X. Game X can only have a single instance of a 'username', but that same username can be present in other games.
@WanBachtiar Я использую драйвер mgo.v2 с установленной последней версией MongoDB. Я просмотрел предоставленную вами ссылку, но хочу проверить только конкретный документ. Итак, если игрок Y хочет присоединиться к игре X, проверьте игру X на предмет любых других записей имени пользователя Y игрока.
Вы можете использовать $ elemMatch
collection.Find(bson.M{"gamecode": entry.GameCode},bson.M{"players": bson.M{"$elemMatch": bson.M{"playerid": playerid}}}).Limit(1).Count()
Это то, что я пытался сделать, однако я хочу искать в БД конкретный документ, а не все из них. Поэтому я хочу узнать, есть ли в конкретной игре другой игрок с таким же именем пользователя.
проверьте мой отредактированный ответ: теперь вы можете найти конкретную игру, и игрок уже существует или нет.
Привет @ CarsonS5, какой драйвер MongoDB Go вы используете? Кроме того, какую версию MongoDB вы используете? Вы можете попробовать использовать $ elemMatch: массив встроенных документов для запроса.