簡體   English   中英

MongoDB 查詢更新未找到匹配項

[英]MongoDB query updateOne doesn't find match

我不明白我做錯了什么。

數據庫意圖:

category : {
    name : category_name, subcategory : [{
        name : subcategory_name, skill : [{
            name : skill_name
        }]
    }]
}

類別有一系列子類別,其中也有一系列技能。

所以我可以有很多子類別歸入一個類別,每個子類別可以有很多技能。

以下查詢創建類別“Web 開發”,其中包含 2 個子類別“前端”和“后端”,以及它們各自的技能

db.skills.insertOne({ category : { cat_name : "Web development", subcategory : [{ subcat_name : "Frontend", skills : [{ skill_name : "Angular", skill_name : "Css"}]}, { subcat_name : "Backend", skills : [{ skill_name : "Nodejs", skill_name : "Express" }]}]}})

問題:下面的查詢返回 { "acknowledged": true, "matchedCount": 0, "modifiedCount": 0 } 這意味着它沒有找到類別“Web development”

db.skills.updateOne( { category : { cat_name : "Web development" }}, { $set: { category : { cat_name : "Not web development" }}} )

下一個查詢相同,它沒有找到子類別

db.skills.updateOne( { subcategory : { subcat_name : "Frontend" }}, { $push: { skills : { skill_name : "SASS" }}} )

db.skills.find() 返回第一個 insertOne 但沒有第一個技能,來自前端子類別的“Angular”和來自后端子類別的“Nodejs”,這沒有任何意義:

{ "_id" : ObjectId("62effb72d6fbc7d2a7d756d5"), "category" : { "cat_name" : "Web development", "subcategory" : [ { "subcat_name" : "Frontend", "skills" : [ { "skill_name" : "Css" } ] }, { "subcat_name" : "Backend", "skills" : [ { "skill_name" : "Express" } ] } ] } }

將您的架構稍微更改為我認為您打算做的事情,這里有幾個update命令,展示了如何完成您想要的。 請注意“點符號”和"arrayFilters"的使用。 這些不是唯一的方法,只是其中一種方法。

db.collection.update({
  "categories.cat_name": "Web development"
},
{
  "$push": {
    "categories": {
      "cat_name": "Not web development"
    }
  }
})

mongoplayground.net上試試。

這是您如何"$push"一項新技能的方法。

db.collection.update({
  "categories.cat_name": "Web development"
},
{
  "$push": {
    "categories.$[catElem].subcategories.$[subcatElem].skills": "SASS"
  }
},
{
  "arrayFilters": [
    {"catElem.cat_name": "Web development"},
    {"subcatElem.subcat_name": "Frontend"}
  ]
})

mongoplayground.net上試試。

暫無
暫無

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

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