首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >按索引删除MongoDB集合中的元素

按索引删除MongoDB集合中的元素
EN

Stack Overflow用户
提问于 2020-06-21 19:56:10
回答 2查看 94关注 0票数 0

我正在使用pymongo,并且我有一个用户集合。用户实例类似于:

代码语言:javascript
代码运行次数:0
运行
复制
    user = {"Email":"user@gmail.com" , "Comments":["Good"  , "Bad" , " Very bad "] }

我正在尝试按索引删除Comments[]字段中的元素(例如。index =0 delete "Good")我将索引与输入数字相同的注释设置为"deleted“,然后拉出它,因为我正在迭代特定用户的Comments[]数组,因此收到错误消息

代码语言:javascript
代码运行次数:0
运行
复制
pymongo.errors.WriteError: Cannot create field 'i+1' in element

我不明白为什么。我的代码:

代码语言:javascript
代码运行次数:0
运行
复制
                comment_num = int(comment_num) #an index I have as input
                exists = False #we will check if index exists in list 
                for i , value in enumerate(usr['Comments']):
                    if i+1 == comment_num: #if index is comment_num
                        print("Comment number exists")
                        exists = True
                        #I get the error here
                        users.update_one({"Email":email} , {"$set" : {"Comments.i+1" : "deleted" } } )
                        users.update_one({"Email":email} , {"$pull":{"Comments":"deleted" }})
                    elif i+1 == len(usr['Comments']) and exists == False:
                        print('Comment does not exist') #if index not found 

如果您能帮助我解决这个错误,我将不胜感激。提前谢谢你

EN

回答 2

Stack Overflow用户

发布于 2020-06-21 20:42:50

从MongoDB v4.2开始,不能使用$set直接指向给定索引处的数组,也不能使用$pull删除给定索引处的元素。

从v4.2开始,您可以做的是使用update with aggregation pipeline将数组更新为指定索引前后的数组元素的串联。

因此,如果您有i = 0,那么它将是[]["Bad" , " Very bad "]的串联

如果您有i = 1,那么它将是["Good"][" Very bad "]的串联

我们可以使用$concatArrays$slice

代码语言:javascript
代码运行次数:0
运行
复制
users.update_one(
  { "Email": email } , 
  [{ // specify update as an array to use the pipeline update
    "$set": {
      "Comments": {
        "$concatArrays": [
          { "$slice": ["$Comments", i] }, // keep i elements from the start of the array
          { "$slice": ["$Comments", i+1, { "$size": "$Comments" } ] } // keep element from i+1 to the end of the array
        ]
      }
    }
  }]
)

提示:如果想要删除第一个或最后一个数组元素,可以使用$pop

票数 1
EN

Stack Overflow用户

发布于 2020-06-21 22:06:35

修正:比我想象的要简单得多,也没那么复杂。

代码语言:javascript
代码运行次数:0
运行
复制
            comment_num = int(comment_num)
            exists = False
            for i , value in enumerate(usr['Comments']):
                if i+1 == comment_num:
                    print("Comment number exists")
                    exists = True
                    users.update_one({"Email":email} , 
                    {"$pull":{"Comments":value}})
                elif i+1 == len(usr['Comments']) and exists == False:
                    print('Comment does not exist')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62498176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档