use*_*803 6 mongodb pymongo mongoengine
我有以下格式的数千份文件:
{
"_id" : ObjectId("51e98d196b01c2085c72d731"),
"messages" : [
{
"_id" : ObjectId("520167056b01c20bb9eee987"),
"id" : ObjectId("520167056b01c20bb9eee987"),
},
{
"_id" : ObjectId("520167056b01c20bb9eee988"),
"id" : ObjectId("520167056b01c20bb9eee988"),
},
{
"_id" : ObjectId("520167056b01c20bb9eee989"),
"id" : ObjectId("520167056b01c20bb9eee989"),
}
],
}
Run Code Online (Sandbox Code Playgroud)
我需要删除重复的"id"字段.这是我尝试过的:
db.forum_threads.update({}, {$unset: {"messages.$.id": 1}}, {multi: true});
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
Cannot apply the positional operator without a corresponding query field containing an array.
Run Code Online (Sandbox Code Playgroud)
Mas*_*son 14
您收到该错误的原因是因为您在filter子句中没有任何谓词.你可以这样做:
mongos> db.test.update({"messages.id": {$exists: true}}, {$unset: {"messages.$.id":true}}, {multi:true})
Run Code Online (Sandbox Code Playgroud)
并且您不会收到错误 - 实际上其中一个文档将id删除该属性.问题是位置运算符只匹配与谓词匹配的数组的FIRST元素,它不匹配所有元素.更大的问题是,目前无法在MongoDB中更新数组中的所有元素(https://jira.mongodb.org/browse/SERVER-1243).
你需要使用数字位置("messages.0.id","messages.1.id"等)遍历数组中的每个元素,或者你可以将数组拉入你的应用程序,循环遍历元素并更新它们,然后将数组保存回来.
您可以从JIRA票证中看到此问题已经开放了很长一段时间,但10gen似乎并不认为它是非常优先的.
小智 6
使用 Mongo 3.6,您可以使用新的位置标识符并执行以下操作:
db.test.update({"messages.id": {$exists: true}}, {$unset: {"messages.$[].id":true}}, {multi:true})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7908 次 |
| 最近记录: |