代码之家  ›  专栏  ›  技术社区  ›  Maro Torres

更新mongodb对象数组上字符串数组中的值

  •  1
  • Maro Torres  · 技术社区  · 7 年前

    我正在尝试更新mongodb中字符串数组的值,它位于另一个对象数组中

    下面是该模型的一个示例

    { 
        "_id" : ObjectId("5a8cd02f87d4839d279f6559"), 
        "category" : "0",
        "email" : "doctor@doctor.com",
        "password" : "doctor",
        "name" : "doctor",
        "directorys" : [ { 
                           "path" : "doctor@doctor.com/own/", 
                           "files" : [ "" ] 
                         }, 
                         {
                           "path" : "doctor@doctor.com/modified/",
                           "files" : [ "" ] 
                         },
                         { 
                          "path" : "doctor@doctor.com/own/pacient1", 
                          "files" : [ "", "README.txt" ] 
                         } 
                       ] }
    }
    

    因此,我试图将名称“README.txt”更新为“README2.txt”,但我正在努力使用mongo

    我试过这个

    db.users.update({"email":"doctor@doctor.com","directorys.files":"README.txt"},{"$set":{"directorys.files.$":"README2.txt"}})
    

    但抛出以下错误

    WriteResult({
        "nMatched" : 0,
        "nUpserted" : 0,
        "nModified" : 0,
        "writeError" : {
            "code" : 16837,
            "errmsg" : "cannot use the part (directorys of directorys.files.2) to traverse the element ({directorys: [ { path: \"doctor@doctor.com/own/\", files: [ \"\" ] }, { path: \"doctor@doctor.com/modified/\", files: [ \"\" ] }, { path: \"doctor@doctor.com/own/pacient1\", files: [ \"\", \"README.txt\" ] } ]})"
        }
    })
    

    我错过了什么?我不知道该怎么办

    2 回复  |  直到 7 年前
        1
  •  0
  •   Hashcut    7 年前

    由于directorys是一个数组,我认为您也需要一个数组操作符。尝试此查询:

    db.users.update(
        {"email":"doctor@doctor.com","directorys.files":"README.txt"},
        {"$set":{"directorys.$[selectedFiles].files.$":"README2.txt"}},
        {arrayFilters: [{"selectedFiles.files": "README.txt"}]}
    )
    

    您可以在此处查看有关arrayFilters的更多信息: https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/#up. S []

    ArrayFilters允许您获取一个数组,只选择那些符合特定条件的元素,然后将$set(或任何其他更新/升级操作符)仅应用于这些元素。

    但有一点是,这只会更新包含自述的文件数组的第一个元素。txt。如果自述。txt存在多次,您不会更新所有txt。如果要更新数组中自述的所有元素。txt,您需要第二个arrayFilter,如下所示:

    db.users.update(
        {"email":"doctor@doctor.com","directorys.files":"README.txt"},
        {"$set":{"directorys.$[selectedDirs].files.$[selectedFiles]":"README2.txt"}},
        {arrayFilters: [{"selectedDirs.files": "README.txt"}, {"selectedFiles": "README.txt"}]}
    )
    

    它应该选择具有至少一个自述文件的文件数组的所有目录元素。txt,然后选择该文件数组中等于README的所有元素。txt,然后将这些元素设置为README2。txt。

        2
  •  0
  •   Maro Torres    7 年前

    我可以通过以下命令更新数组中的元素

    db.users.update({"directorys.files":"README.txt","email":"doctor@doctor.com"},{"$set":{"directorys.$.files.1":"README2.txt"}})

    我必须做一些服务器端的工作,才能按常规获得数字“1”,但这解决了我的问题。

    我从这里得到了灵感 https://dba.stackexchange.com/questions/114329/mongodb-update-object-in-array