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如何使用包含子文档的自定义键创建一个数组的主要内容,如果未能解决你的问题,请参考以下文章