{ 
    name: 'book',
    tags: {
        words: ['abc','123'],
        lat: 33,
        long: 22
    }
}

假设这是一个文档。我如何从这个集合中的所有文档中完全删除“单词”?我希望所有的文件都没有“文字”:

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}

当前回答

您也可以使用3.4中的project在聚合中实现这一点

{$项目:{"标签。0}}

其他回答

检查“words”是否存在,然后从文档中删除

    db.users.update({"tags.words" :{$exists: true}},
                                           {$unset:{"tags.words":1}},false,true);

True表示匹配时更新多个文档。

您也可以使用3.4中的project在聚合中实现这一点

{$项目:{"标签。0}}

我试图做类似的事情,但从嵌入的文档中删除列。我花了一段时间才找到解决办法,这是我看到的第一个帖子,所以我想把它贴在这里,给那些试图做同样事情的人。

假设你的数据是这样的:

{ 
  name: 'book',
  tags: [
    {
      words: ['abc','123'],
      lat: 33,
      long: 22
    }, {
      words: ['def','456'],
      lat: 44,
      long: 33
    }
  ]
}

要从嵌入的文档中删除列词,请执行以下操作:

db.example.update(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}},
  {multi: true}
)

或者使用updateMany

db.example.updateMany(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}}
)

$unset只会在值存在时编辑它,但它不会进行安全导航(它不会首先检查标签是否存在),因此在嵌入的文档中需要exists。

这使用了3.6版引入的所有位置操作符($[])

在mongoDB shell中,这段代码可能会有帮助:

db.collection.update({}, {$unset: {fieldname: ""}} )

值得一提的是,如果你使用Typegoose/Mongoose,你的字段需要在你的模型中声明,否则$unset将默默失败。

在重构数据库后,这让我没有意识到。多余的字段不再在我的模型中,我正在运行$unset,但什么也没有发生。

因此,如果你正在进行一些重构,请确保在从模型中删除冗余字段之前将其$unset。