从 mongoDB 集合中删除一个字段

Remove one field from mongoDB collection

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

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

我将严格模式设置为 false,因此我可以推送任何我想要的 'key' 值。

我只想删除“收入”类别中的一个,但我无法指定该行,因为没有'defined key'。 这是内部数据的示例:

{
    "_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)
        }
}

有什么想法吗?

如果您想 remove/unset 文档中的特定值,则必须提供该键的完整路径。

让我们举个例子,如果你想删除 anyKeyNameIWant 那么你的路径将是 incomes.anyKeyNameIWant 并且更新查询将是这样的

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

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

中删除完整的 incomes

这里是link官方文档,如果你想了解更多详情$unset

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

一个解决方案是这个:

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" } } }
   ]
)