更新 mongodb 中嵌套数组的最后一个元素
Update last element of a nested array in mongodb
我试过下面的 mongoose 查询,但似乎不起作用:
Model.findOneAndUpdate(
{
name: origin
},
{
$set: {
'field1.$[id1].field2.-1': "value"
}
},
{
arrayFilters: [
{ 'id1.userId': "customerId" }
],
new: true
}
);
Note: field1
and field2
are arrays
MongoDB 不接受负索引,这导致了问题。
您可以考虑使用 $set (aggregation) operator and use double $map 运算符:
db.collection.aggregate([
{ $match: { name: "myname" } }
{
$set: {
field1: {
$map: {
input: "$field1",
in: {
$cond: {
if: { $ne: [ "$$this.userId", "customerId" ] },
then: "$$this",
else: {
$mergeObjects: [
"$$this",
{
field2: {
$concatArrays: [
{ $slice: [ "$$this.field2", { $add: [ { $size: "$$this.field2" }, -1 ] } ] },
["value"]
]
}
}
]
}
}
}
}
}
}
}
])
在更新中应用 $set 运算符和 $ 位置运算符来更改名称字段。
$ 位置运算符将识别数组中要更新的正确元素,而无需明确指定元素在数组中的位置,因此您的最终更新语句应如下所示:
db.collection.update(
{ "friends.u.username": "michael" },
{ "$set": { "friends.$.u.name": "hello" } }
)
答案取自 -
我试过下面的 mongoose 查询,但似乎不起作用:
Model.findOneAndUpdate(
{
name: origin
},
{
$set: {
'field1.$[id1].field2.-1': "value"
}
},
{
arrayFilters: [
{ 'id1.userId': "customerId" }
],
new: true
}
);
Note:
field1
andfield2
are arrays
MongoDB 不接受负索引,这导致了问题。
您可以考虑使用 $set (aggregation) operator and use double $map 运算符:
db.collection.aggregate([
{ $match: { name: "myname" } }
{
$set: {
field1: {
$map: {
input: "$field1",
in: {
$cond: {
if: { $ne: [ "$$this.userId", "customerId" ] },
then: "$$this",
else: {
$mergeObjects: [
"$$this",
{
field2: {
$concatArrays: [
{ $slice: [ "$$this.field2", { $add: [ { $size: "$$this.field2" }, -1 ] } ] },
["value"]
]
}
}
]
}
}
}
}
}
}
}
])
在更新中应用 $set 运算符和 $ 位置运算符来更改名称字段。
$ 位置运算符将识别数组中要更新的正确元素,而无需明确指定元素在数组中的位置,因此您的最终更新语句应如下所示:
db.collection.update(
{ "friends.u.username": "michael" },
{ "$set": { "friends.$.u.name": "hello" } }
)
答案取自 -