我有一个非常简单的文档 struct ,如:
{
"_id": "...",
"vector": [100,50,4000],
//...
}
我想写一个update语句,它将一个给定的文档id的vector
改变一个给定的delta(也是一个整数向量).[100,50,4000]
加上Δ [-50,0,-2000]
的结果是[50,50,2000]
.
如果结果向量有任何负值,我还希望语句失败.
我该怎么做?
我有一个非常简单的文档 struct ,如:
{
"_id": "...",
"vector": [100,50,4000],
//...
}
我想写一个update语句,它将一个给定的文档id的vector
改变一个给定的delta(也是一个整数向量).[100,50,4000]
加上Δ [-50,0,-2000]
的结果是[50,50,2000]
.
如果结果向量有任何负值,我还希望语句失败.
我该怎么做?
您可以使用带有聚合管道的更新来实现这一点.为了只更新具有匹配id的文档,您需要对_id
字段应用一个过滤器.
为了能够区分未找到和未修改(由于负值),您需要应用聚合管道:
vector_updated
中.vector_updated
的值小于0.如果是,则保持vector
字段不变;否则,从`VECTOR_UPDATED中分配新值.vector_updated
字段.这样,如果文档匹配,则更新操作的结果返回matchedCount
的1,如果文档更新,则返回modifiedCount
的1.
这是聚合管道的示例:
db.collection.update({
_id: 1
},
[
{
$set: {
vector_updated: {
$reduce: {
input: "$vector",
initialValue: [],
in: {
$concatArrays: [
"$$value",
[
{
$add: [
"$$this",
{
$arrayElemAt: [
[
-50,
0,
-2000
],
{
$size: "$$value"
}
]
}
]
}
]
]
}
}
}
}
},
{
$set: {
vector: {
$cond: {
if: {
$lt: [
{
$min: "$vector_updated"
},
0
]
},
then: "$vector",
else: "$vector_updated"
}
}
}
},
{
$unset: "vector_updated"
}
])
看看这个mongoplayground来测试一下.