Найти конкретное поле в массиве вложенных документов - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь найти определенный элемент массива в моем документе MongoDB, но при всех моих попытках запрос возвращает весь массив. Как я могу получить нужный объект?

Документ моей коллекции выглядит следующим образом:

{
  "Achievements": [
    {
      "AchievementID": 1,
      "AchievementEventID": 0
    },
    {
      "AchievementID": 2,
      "AchievementEventID": 1
    }
  ],
  "Buildings": [
    {
      "BuildingID": 1,
      "BuildingType": "type1"
    },
    {
      "BuildingID": 2,
      "BuildingType": "type1"
    },
  ]
}

Я пытался получить только один элемент из моего Achievements массива:

db.data.find({'Achievements.AchievementEventID': 0})

Я ожидал получить только элемент с AchievementEventID, равным 0:

{
  "AchievementID": 1,
  "AchievementEventID": 0
}

Но я получил целый массив Achievements. Как я мог получить только конкретный элемент?

I just tried queries but all of these works incorrect

Ответы [ 3 ]

0 голосов
/ 15 октября 2019
  • Вы можете использовать агрегат вместо поиска, подобной этой

    db.data.aggregate ([{'$unwind':'$Achievements'},{$match:{ 'Achievements.AchievementEventID':0 }},{$project:{ 'AchievementID':'$Achievements.AchievementID', 'AchievementEventID':'$Achievements.AchievementEventID' }}]);

0 голосов
/ 15 октября 2019

Вы можете использовать запрос агрегации , как в следующем примере. Образец коллекции achive содержит 3 документа:

{
        "_id" : 1,
        "Achievements" : [
                {
                        "AchievementID" : 1,
                        "AchievementEventID" : 0
                },
                {
                        "AchievementID" : 2,
                        "AchievementEventID" : 1
                }
        ],
        "Buildings" : [
                {
                        "BuildingID" : 1,
                        "BuildingType" : "type1"
                },
                {
                        "BuildingID" : 2,
                        "BuildingType" : "type1"
                }
        ]
}
{
        "_id" : 2,
        "Achievements" : [
                {
                        "AchievementID" : 2,
                        "AchievementEventID" : 2
                }
        ],
        "Buildings" : [
                {
                        "BuildingID" : 2,
                        "BuildingType" : "type2"
                }
        ]
}
{
        "_id" : 3,
        "Achievements" : [
                {
                        "AchievementID" : 31,
                        "AchievementEventID" : 1
                }
        ],
        "Buildings" : [
                {
                        "BuildingID" : 3,
                        "BuildingType" : "type3"
                }
        ]
}

Запрос:

db.achive.aggregate( [
    { $project: { Buildings: 0} },
    { $unwind: "$Achievements" },
    { $match: { "Achievements.AchievementEventID": { $eq: 1 } } }
])
=>
{ "_id" : 1, "Achievements" : { "AchievementID" : 2, "AchievementEventID" : 1 } }
{ "_id" : 3, "Achievements" : { "AchievementID" : 31, "AchievementEventID" : 1 } }

Я добавил поле _id для идентификации выбранных документов.


Обновлен запрос:

db.achive.aggregate( [
{ $unwind: "$Achievements" },
{ $match: { "Achievements.AchievementEventID": { $eq: 1 } } },
{ $project: { AchievementID:  "$Achievements.AchievementID", _id: 0} },
])
=>
{ "AchievementID" : 2 }
{ "AchievementID" : 31 }
0 голосов
/ 15 октября 2019

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

db.data.find(
   { 'Achievements.AchievementEventID': 0},{Buildings:0, Achievements: {$elemMatch: {AchievementEventID: 0}}}
)

Если вышеприведенное решение не подходит для вас, попробуйте следующее:

db.data.find({"Achievements.AchievementEventID": 0}, {Buildings: 0, 'Achievements.$': 1});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...