我正在研究具有如下模型的 mongodb
const appJobSchema = new mongoose.Schema({
data:[
{ type:Schema.Types.Mixed}
],
stat:{
dataCount: { type:Number , default: 0 },
}
})
我需要做的是将一些记录更新到mongodb数组字段-data,同时将最新的数组长度更新到stat.dataCount字段。
export async function updateDataById(id:string, records:any[]){
return await model.updateOne({'_id':id}, {
'$addToSet': { 'data': { '$each': records } } ,
'$set':{
'stat.dataCount': { $size: "$data" } }
} );
}
但我收到错误说
uncaughtException: Cast to Number failed for value "{ '$size': '$data' }" (type Object) at path "stat.dataCount"
知道我该怎么做吗?
更新
管道上的首次尝试
return await model.updateOne({'_id':id},
[
{
"$set": {
"data": {
$concatArrays: [ "$data", records ]
}
}
},
{
'$set':{
'stat.dataCount': { $size: "$data" } }
}
]);
它可以工作,但问题是仅仅向数据数组添加值就会导致重复的值,这就是为什么我必须使用 $addToSet 来删除重复的值。
管道第二次尝试
Model.updateOne({'_id':id},
[
{ '$addToSet': { 'data': { '$each': records } }, '$inc':{ 'runCount': 1 } ,
{
'$set':{
'stat.dataCount': { $size: "$data" } }
}
]);
它抛出了 uncaughtException:无效的更新管道运算符:“$addToSet”。$inc 也是一样。
最后通过 $setUnion 和管道让它工作,
await Model.updateOne({'_id':id},
[
{
"$set": {
"data": {
$setUnion: [ "$data", records ]
}
}
},
{
'$set':{
'stat.dataCount': { $size: "$data" } }
},
]);
但是如果我需要使用 $inc,这似乎仍然是一个问题。
由于您正在切换到更新管道以使用聚合运算符,因此不支持更新运算符。您需要切换到所有聚合运算符,例如
$sum
替换$inc
。