MongoDB如何使用包含子文档的自定义键创建一个数组

Posted

技术标签:

【中文标题】MongoDB如何使用包含子文档的自定义键创建一个数组【英文标题】:MongoDB how do I make an array with custom keys containing subdocument 【发布时间】:2015-05-14 06:33:10 【问题描述】:

好吧,所以使用 Python 和 MongoDB,我试图在数组中嵌入一个子文档,并在数组中使用自定义键值。我正在尝试各种不同的方法来做到这一点,但我无法弄清楚我做错了什么,所以我暂时选择了下面的工作代码。多次尝试总是会导致错误:

在_check_write_command_response raise OperationFailure(error.get("errmsg"), error.get("code"), error) pymongo.errors.OperationFailure: 虚线字段'first.rule' 在“followedBy..first.rule”中对存储无效。

代码:

 citizens.update(
    "_id" : userPush,
    "$push": "followedBy":[field[1], field[2], field[3], field[0]])

生产:

 "_id" : ObjectId("5…asfd"), 
            "uName" : "tim0", 
            "fName" : "tim",
            "lName" : "lost",
            "pic" : null, 
            "bio" : "I <3 MongoDB", 
            "followedBy" : [
                [
                    "BobTheBomb", 
                    "bobby", 
                    "knight", 
                    NumberInt(2)
                ], 
                [
                    "Robert", 
                    "DROP", 
                    "TABLE", 
                    NumberInt(6)
                ]

这就是我想要的:

"_id" : ObjectId("5…asfd"), 
    "uName" : "tim0", 
    "fName" : "tim",
    "lName" : "lost",
    "pic" : null, 
    "bio" : "I <3 MongoDB", 
    "followedBy" : [
            "BobTheBomb":  
                    "fName" : "bobby", 
                    "lName" : "knight", 
                    "uID" : NumberInt(2)
        , 
            "Robert":  
                    "fName" : " DROP ", 
                    "lName" : " TABLE ", 
                    "uID" : NumberInt(6)
        
    ]

【问题讨论】:

【参考方案1】:

您需要构建该数据结构,目前您说"followedBy" 只是一个列表。

那就试试吧:

citizens.update(
    "_id" : userPush,
    "$push": "followedBy":field[1]:  "fName":field[2], "lName":field[3], "uID":field[0])

删除列表并将其替换为字典。

我希望这会有所帮助。


我意识到我没有给你有效的json,我已经测试过了:

citizens.update(
    "_id" : userPush,
    $push: 
    "followedBy":
        [
            field[1]: 
                 "fName": field[2], "lName": field[3], "uID": field[0]
            
        ]
     
)

而且成功了……


您可能会发现错误是由您使用的修饰符引起的,我在blog上找到了以下内容:

MongoDB 提供了几种不同的修饰符,您可以使用这些修饰符来就地更新文档,包括以下(更多详细信息请参阅updates):

- $inc Increment a numeric field (generalized; can increment by any number)
- $set Set certain fields to new values
- $unset Remove a field from the document
- $push Append a value onto an array in the document
- $pushAll Append several values onto an array
- $addToSet Add a value to an array if and only if it does not already exist
- $pop Remove the last (or first) value of an array
- $pull Remove all occurrences of a value from an array
- $pullAll Remove all occurrences of any of a set of values from an array
- $rename Rename a field
- $bit Bitwise updates

您可能会发现,因为您插入了许多您宁愿使用$pushAll$addToSet 而不是$push 的项目...只是推测...

【讨论】:

它返回“pymongo.errors.OperationFailure:'followedBy..0.first.rule'中的虚线字段'first.rule'对存储无效。”当我尝试调整它时,我一直在早期遇到这个错误,以及其他几个错误。 生成文字字符串“field[1]”。输出:“followedBy”:[ “field[1]”:“uID”:“field[0]”,“fName”:“field[2]”,“lName”:“field[3]” 抱歉……我用字符串值来测试输出 - 试试更新的 不,您很好,非常感谢您的帮助。我尝试了更新的代码,它仍然给我一个顽固的错误:“in _check_write_command_response raise OperationFailure(error.get("errmsg"), error.get("code"), error) pymongo.errors.OperationFailure: The dotted field 'followedBy..first.rule' 中的 'first.rule' 对存储无效。”我要去睡觉了,明天再打一次。感谢您的帮助 还是没有运气,我卡在同一个错误上,我不明白这个错误

以上是关于MongoDB如何使用包含子文档的自定义键创建一个数组的主要内容,如果未能解决你的问题,请参考以下文章

保存时使用字符串作为猫鼬模型的自定义 ID

子文档键上的 MongoDB 索引

子文档键上的 MongoDB 索引

如何使用php更新mongodb中具有键和值的子文档

如何使用php更新mongodb中具有键和值的子文档

获取数组中每个索引的子文档元素计数并更新子文档键 - 数组中的子文档(IN MONGODB)