从 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" } } }
]
)
我有一个 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" } } }
]
)