如何删除MongoDb中嵌入文档中数组的“属性”?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何删除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个这样的项目,我必须从每个项目中删除“attribute”“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...

我怎样才能做到这一点?

答案

我们可以使用$unsetfiltered positional operator来做到这一点

从阵列中删除所有cast_id的更新如下所示

db.crediti.update( 
   {}, 
   {$unset:{"cast.$[].cast_id":""}},
   {multi:1}
);

更新查询有三个部分,

第一部分是选择我们要更新的集合中的所有文档,这里我们将其作为空文档给出,因此它适用于集合中的所有文档。

查询的第二部分是使用过滤的位置运算符和$ unset,它可以从数组中的所有文档中删除cast_id

查询的第三部分对集合上的多个文档进行更新

请注意,$[identifier]适用于3.6版本

以上是关于如何删除MongoDb中嵌入文档中数组的“属性”?的主要内容,如果未能解决你的问题,请参考以下文章

mongoose:使用$ pull删除嵌入式文档数组中的值(MongoDB 3.4版本)

如何在嵌入式数组mongodb中查询嵌入式文档

如何匹配 MongoDB 中嵌入式数组或文档中的字符串?

如何使用 mongodb 中的聚合在嵌入文档的数组中执行操作?

查询spring数据mongodb中嵌入文档的数组

通过 Mongoose、Node.js、MongodB 中的特定属性查找嵌入式文档