Проверьте наличие дубликатов в массиве объектов в Golang с помощью MongoDB

Мне нужно найти повторяющиеся записи определенного значения в массиве объектов в базе данных 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.

Привет @ CarsonS5, какой драйвер MongoDB Go вы используете? Кроме того, какую версию MongoDB вы используете? Вы можете попробовать использовать $ elemMatch: массив встроенных документов для запроса.

Wan Bachtiar 31.10.2018 08:11

@WanBachtiar Я использую драйвер mgo.v2 с установленной последней версией MongoDB. Я просмотрел предоставленную вами ссылку, но хочу проверить только конкретный документ. Итак, если игрок Y хочет присоединиться к игре X, проверьте игру X на предмет любых других записей имени пользователя Y игрока.

CarsonS5 31.10.2018 13:01
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
2
2
1 223
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать $ elemMatch

collection.Find(bson.M{"gamecode": entry.GameCode},bson.M{"players": bson.M{"$elemMatch": bson.M{"playerid": playerid}}}).Limit(1).Count()

Это то, что я пытался сделать, однако я хочу искать в БД конкретный документ, а не все из них. Поэтому я хочу узнать, есть ли в конкретной игре другой игрок с таким же именем пользователя.

CarsonS5 31.10.2018 13:08

проверьте мой отредактированный ответ: теперь вы можете найти конкретную игру, и игрок уже существует или нет.

Senthur Deva 31.10.2018 13:17

Другие вопросы по теме