簡體   English   中英

在嵌入文檔數組中查找特定字段

[英]Find specific field in an array of embedded documents

我試圖在我的 MongoDB 文檔中找到數組的特定元素,但是我的所有嘗試查詢都返回了所有數組。 如何獲得正確的 object?

我收藏的文檔如下所示:

{
  "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數組。 我怎么能只得到特定的元素?

我剛剛嘗試了查詢,但所有這些工作都不正確

您可以為此使用 $elemMatch

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

如果上述解決方案不適合您,請嘗試以下解決方案:

db.data.find({"Achievements.AchievementEventID": 0}, {Buildings: 0, 'Achievements.$': 1});
  • 您可以使用聚合而不是這樣的查找

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

您可以使用聚合查詢,如下例所示。 樣本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 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM