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

时间:2018-02-21 02:54:32

标签: arrays mongodb updates

我试图更新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" to" 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 个答案:

答案 0 :(得分:0)

我可以使用以下命令更新数组中的元素

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

我必须做一些服务器端工作才能将这个数字设为“1”dinamycally,但这解决了我的问题。

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

答案 1 :(得分:0)

由于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(或任何其他更新/ upsert运算符)应用于这些元素。

但有一点是,这只会更新具有README.txt的文件数组的第一个元素。如果README.txt多次出现,则不会更新所有这些内容。如果要更新数组中README.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"}]}
)

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