gpt4 book ai didi

javascript - 将 Mongoose 文档中的字段设置为数组长度

转载 作者:搜寻专家 更新时间:2023-10-31 22:23:42 24 4
gpt4 key购买 nike

我有一个 Mongoose 文档(Mongoose 5.4.13,mongoDB 4.0.12):

var SkillSchema = new mongoose.Schema({
skill: { type: String },
count: { type: Number, default: 0 },
associatedUsers: [{ type : mongoose.Schema.Types.ObjectId, ref: 'User' }]
});

我更新如下:

var query = { skill: req.body.skill };
var update = { $addToSet: { associatedUsers: req.params.id } };

var options = { upsert: true, new: true, setDefaultsOnInsert: true };

await skillSchema.findOneAndUpdate(query, update, options);

在此更新期间,我还想将 count 更新为等于 associatedUsers 的长度。

理想情况下,我希望通过 pre-hook 在更新其他字段的同时发生这种情况(即不在后续更新中)。或在 findOneAndUpdate 中。

我试过在模式定义后使用预 Hook :

SkillSchema.pre('findOneAndUpdate', async function(){
console.log("counting associated users");
this.count = this.associatedUsers.length;
next();
});

以及使用 aggregate在我的更新 route :

await skillSchema.aggregate([{ $project: { count: { $size: "$associatedUsers" } } } ])

但我无法工作。

有没有人对我如何实现这一目标有任何建议

最佳答案

你可以使用 $set像 4.2 中的这样,它支持更新中的聚合管道。

第一个 $set 阶段根据以前的值和新值计算 associatedUsers$setUnion保持不同的 associatedUsers 值。

第二个$set阶段根据前一阶段计算的associatedUsers计算tally$size计算 associatedUsers 值的长度。

var query = {skill: req.body.skill};
var update = [{ $set: { "associatedUsers":{"$setUnion":[{"$ifNull":["$associatedUsers",[]]}, [req.params.id]] }}}, {$set:{tally:{ $size: "$associatedUsers" }}}];
var options = { upsert: true, new: true, setDefaultsOnInsert: true };
await skillSchema.findOneAndUpdate(query, update, options)

如果任何参数解析为 null 值或引用缺少的字段,$setUnion 将返回 null。所以只需要用$ifNull来保护我们的操作

关于javascript - 将 Mongoose 文档中的字段设置为数组长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56024824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com