从 mongoDB 集合中删除一个字段

Posted

技术标签:

【中文标题】从 mongoDB 集合中删除一个字段【英文标题】:Remove one field from mongoDB collection 【发布时间】:2021-09-11 10:48:21 【问题描述】:

我有一个 mongoDB 集合,我将它与 mongoose Schema 一起使用:

const balanceSchema = new mongoose.Schema(
    userId: 
        type: mongoose.Schema.Types.ObjectId, ref: 'user'
    ,
    incomes:  Number ,
    fees:  Number ,
,
     strict: false )

我将严格模式设置为 false,因此我可以使用它的值推送我想要的任何“键”。

我只想删除“收入”类别之一,但我无法指定该行,因为没有“定义的键”。 这是里面数据的一个例子:


    "_id": 
        "$oid": "60c763df3d260204865d2069"
    ,
    "incomes": 
        "income1": 1300,
        "anyKeyNameIWant": 400
    ,
    "fees": 
        "charge1": 29,
        "charge2": 29,
        "chargetest": 29,
        "charge7": 29
    ,
    "__v": 0,

我试过了,但没有成功:

module.exports.deleteOneBalance = (req, res) => 
    let data = req.body

    if (!ObjectID.isValid(req.params.id))
        return res.status(400).send('ID unknown : ' + req.params.id);

    BalanceModel.update(
         _id: req.params.id ,
        
            $unset:  "incomes.salairetest": "400" 
        ), (err, docs) => 
            if (!err) res.send('Deleted. ' + data)
            else console.log('Error : ' + err)
        

有什么想法吗?

【问题讨论】:

查看如何引用embedded fields。 请使用正确的术语。 “文件”是什么意思?为什么您要求“删除”但在您的代码中尝试更新。见Documents 我只想删除“收入”类别中的一个“键/值”。我使用 update 因为我看到了 update 和 $unset 的例子 好的,但是“收入”中的一个“键/值”是什么意思?你需要知道你想删除哪一个 - 或者你想保留哪些。 @WernfriedDomscheit 好吧,在我的前面,每个数据的侧面都有一个按钮。因此,如果客户点击 "income1": "700" 旁边的按钮,那么它会从对象 incomes: 中删除 "income1": "700" 而不会删除其他数据 【参考方案1】:

有几种方法可以删除具有动态字段名称的字段。

一个解决方案是这个:

var unset = ;
unset["incomes." + "anyKeyNameIWant"] = null;
db.balanceModel.updateOne( _id: req.params.id ,  $unset: unset )

或者您可以使用这样的聚合管道:

db.balanceModel.updateOne(
    _id: req.params.id , 
   [
       $set:  incomes:  $objectToArray: "$incomes"   ,
       $set:  incomes:  $filter:  input: "$incomes", cond:  $ne: ["$$this.k", "anyKeyNameIWant"]     ,
       $set:  incomes:  $arrayToObject: "$incomes"   
   ]
)

【讨论】:

我做了一些不太漂亮的事情?所以我要偷你的第一个解决方案。谢谢大佬!【参考方案2】:

如果您想从文档中删除/取消设置特定值,则必须提供该键的完整路径。

举个例子,如果你想删除anyKeyNameIWant,那么你的路径就是incomes.anyKeyNameIWant,更新查询是这样的

db.sample.update(
    
      _id: ObjectId("60c763df3d260204865d2069"),
    
      $unset: "incomes.anyKeyNameIWant":""
    )

在您的代码中,您传递了一个在 $unset 中具有键 incomes 的对象,这将从文档中删除完整的 incomes

这里是官方文档的链接,如果您想了解更多详细信息$unset

【讨论】:

感谢您的帮助。我不明白,因为我尝试了您的代码,但它并没有删除该字段。我尝试使用 updateOne,结果相同:/ 您能详细说明您尝试过的确切查询吗?结果如何? 我用我的控制器更新了我的帖子。我的路线是“删除”路线。不是一个帖子。你同意吗? 使用更新的代码你得到了什么结果?路线还行。不会对查询产生太大影响 成功了!现在我只需要找到动态的方式来做到这一点:)。谢谢!!

以上是关于从 mongoDB 集合中删除一个字段的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 数据库创建删除表(集合)

如何从 MongoDB 文档中完全删除字段?

MongoDB复制集的工作原理介绍

mongodb基本操作

mongodb如何删除集合中的指定键值对???

使用 mongoDB 中的聚合删除集合中所有文档的特定字段