-1

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

在 _check_write_command_response raise OperationFailure(error.get("errmsg"), error.get("code"), error) pymongo.errors.OperationFailure: 'followedBy..first.rule' 中的虚线字段 '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)
        }
    ]
4

1 回答 1

0

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

所以试试:

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

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

我希望这会有所帮助。


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

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

它奏效了……


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

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

- $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......只是猜测......

于 2015-03-12T07:42:19.403 回答