[英]How to remove “attribute” on array in embedded document in MongoDb?
我需要從此文檔中刪除每個稱為“ cast_id”的屬性:
{
"_id": ObjectId("5b895f15674e2ddf78bcc6f8"),
"cast": [
{
'cast_id': 14,
'character': 'Woody (voice)',
'credit_id': '52fe4284c3a36847f8024f95',
'gender': 2,
'id': 31,
'name': 'Tom Hanks',
'order': 0,
'profile_path': '/pQFoyx7rp09CJTAb932F2g8Nlho.jpg'
},
{
'cast_id': 15,
'character': 'Buzz Lightyear (voice)',
'credit_id': '52fe4284c3a36847f8024f99',
'gender': 2,
'id': 12898,
'name': 'Tim Allen',
'order': 1,
'profile_path': '/uX2xVf6pMmPepxnvFWyBtjexzgY.jpg'
},
{
'cast_id': 16,
'character': 'Mr. Potato Head (voice)',
'credit_id': '52fe4284c3a36847f8024f9d',
'gender': 2,
'id': 7167,
'name': 'Don Rickles',
'order': 2,
'profile_path': '/h5BcaDMPRVLHLDzbQavec4xfSdt.jpg'
},
{
'cast_id': 17,
'character': 'Slinky Dog (voice)',
'credit_id': '52fe4284c3a36847f8024fa1',
'gender': 2,
'id': 12899,
'name': 'Jim Varney',
'order': 3,
'profile_path': '/eIo2jVVXYgjDtaHoF19Ll9vtW7h.jpg'
},
{
'cast_id': 18,
'character': 'Rex (voice)',
'credit_id': '52fe4284c3a36847f8024fa5',
'gender': 2,
'id': 12900,
'name': 'Wallace Shawn',
'order': 4,
'profile_path': '/oGE6JqPP2xH4tNORKNqxbNPYi7u.jpg'
},
{
'cast_id': 19,
'character': 'Hamm (voice)',
'credit_id': '52fe4284c3a36847f8024fa9',
'gender': 2,
'id': 7907,
'name': 'John Ratzenberger',
'order': 5,
'profile_path': '/yGechiKWL6TJDfVE2KPSJYqdMsY.jpg'
},
{
'cast_id': 20,
'character': 'Bo Peep (voice)',
'credit_id': '52fe4284c3a36847f8024fad',
'gender': 1,
'id': 8873,
'name': 'Annie Potts',
'order': 6,
'profile_path': '/eryXT84RL41jHSJcMy4kS3u9y6w.jpg'
},
{
'cast_id': 26,
'character': 'Andy (voice)',
'credit_id': '52fe4284c3a36847f8024fc1',
'gender': 0,
'id': 1116442,
'name': 'John Morris',
'order': 7,
'profile_path': '/vYGyvK4LzeaUCoNSHtsuqJUY15M.jpg'
},
{
'cast_id': 22,
'character': 'Sid (voice)',
'credit_id': '52fe4284c3a36847f8024fb1',
'gender': 2,
'id': 12901,
'name': 'Erik von Detten',
'order': 8,
'profile_path': '/twnF1ZaJ1FUNUuo6xLXwcxjayBE.jpg'
},
{
'cast_id': 23,
'character': 'Mrs. Davis (voice)',
'credit_id': '52fe4284c3a36847f8024fb5',
'gender': 1,
'id': 12133,
'name': 'Laurie Metcalf',
'order': 9,
'profile_path': '/unMMIT60eoBM2sN2nyR7EZ2BvvD.jpg'
},
{
'cast_id': 24,
'character': 'Sergeant (voice)',
'credit_id': '52fe4284c3a36847f8024fb9',
'gender': 2,
'id': 8655,
'name': 'R. Lee Ermey',
'order': 10,
'profile_path': '/r8GBqFBjypLUP9VVqDqfZ7wYbSs.jpg'
},
{
'cast_id': 25,
'character': 'Hannah (voice)',
'credit_id': '52fe4284c3a36847f8024fbd',
'gender': 1,
'id': 12903,
'name': 'Sarah Freeman',
'order': 11,
'profile_path': None
},
{
'cast_id': 27,
'character': 'TV Announcer (voice)',
'credit_id': '52fe4284c3a36847f8024fc5',
'gender': 2,
'id': 37221,
'name': 'Penn Jillette',
'order': 12,
'profile_path': '/zmAaXUdx12NRsssgHbk1T31j2x9.jpg'
}
]
}
該文檔至少包含45000個這樣的項目,我必須從每個項目中刪除“屬性”, “ cast_id”以及更多“屬性”,例如“ gender”或“ profile_path” 。
我嘗試使用$ pull , $ pullAll , $ unset和以這種方式刪除 ,但未成功。 ( “ crediti”是我收藏的名稱)
db.crediti.update({}, {$pull: {cast: {cast_id}}}, {multi:true})
db.crediti.update({}, {$unset: {cast: {cast_id}}}, {multi:true})
db.crediti.update({}, {$pullAll: {cast: {cast_id}}}, {multi:true})
db.crediti.remove({"cast.cast_id"})
否則,我嘗試以這種方式使用$ unset :
db.crediti.update({}, {$unset:{"cast.cast_id":1}},{multi:true})
結果是:
WriteResult({ "nMatched" : 45476, "nUpserted" : 0, "nModified" : 0 })
他們匹配,但未修改。
我想要的結果是維護其他屬性,如下所示:
{
"_id" : ObjectId("5b895f15674e2ddf78bcc6f8"),
"cast" : "[{'character': 'Woody (voice)', 'id': 31, 'name': 'Tom Hanks'}, etc...
我怎樣才能做到這一點?
下面顯示了從數組中刪除所有cast_id
的更新
db.crediti.update(
{},
{$unset:{"cast.$[].cast_id":""}},
{multi:1}
);
更新查詢包括三個部分,
第一部分是選擇要更新的集合中的所有文檔,這里我們將其指定為空文檔,以便將其應用於集合中的所有文檔。
查詢的第二部分將使用過濾后的位置運算符和$ unset一起使用,該操作cast_id
從數組內的所有文檔中刪除cast_id
。
查詢的第三部分對集合中的多個文檔進行更新
請注意, $ [identifier]適用於3.6版
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.