我有一個包含以下結構的檔案的集合:
{
"_id": ObjectId("..."),
"rides": [
{
status_history: ["status1", "status2", "status3"]
},
{
status_history: ["status4", "status5"]
}
...
]
}
我想要做的是在status_history陣列中最后一次騎行的陣列中附加一個新狀態rides,實作如下目標:
{
"_id": ObjectId("..."),
"rides": [
{
status_history: ["status1", "status2", "status3"]
},
{
status_history: ["status4", "status5", "NEW_STATUS_HERE"]
}
...
]
}
但我無法弄清楚如何做到這一點。我正在使用該mongo-driver包連接到資料庫。
這是我設法想出的代碼:
filter := bson.M{"_id": objectId}
arrayFilters := options.ArrayFilters{
Filters: bson.A{
bson.M{"s": bson.M{"rides": bson.A{"$slice", -1}}},
},
}
upsert := true
opts := options.UpdateOptions{
ArrayFilters: &arrayFilters,
Upsert: &upsert,
}
update := bson.M{
"$push": bson.M{
"rides.$[s].status_history": statusEntry,
},
}
result, err := col.UpdateOne(ctx, filter, update, &opts)
fmt.Println(fmt.Sprintf(
"Matched %v, Modified %v, Upserted %v",
result.MatchedCount,
result.ModifiedCount,
result.UpsertedCount,
))
那的輸出Println是Matched 1, Modified 0, Upserted 0。事實上,檢查集合中的專案表明它沒有改變。
我到底哪里錯了?
uj5u.com熱心網友回復:
此使用聚合管道更新(功能需要 MongoDB v4.2 或更高版本)將更新rides陣列的最后一個元素(嵌套檔案),并將新的狀態值添加到status_history陣列欄位。更新在mongoshell 中運行。
let NEW_VALUE = "new_status_999";
db.test.updateOne(
{ _id: 1 },
[
{
$set: {
rides: {
$concatArrays: [
{ $slice: [ "$rides", { $subtract: [ { $size: "$rides" }, 1 ] } ] },
[ {
$let: {
vars: { lastEle: { $arrayElemAt: [ { $slice: [ "$rides", -1 ] }, 0 ] } },
in: {
$mergeObjects: [
"$$lastEle",
{ status_history: { $concatArrays: [ "$$lastEle.status_history", [ NEW_VALUE ] ] } }
]
}
}
}]
]
}
}
}
])
更新的檔案:
{
"_id" : 1,
"rides" : [
{
"status_history" : [
"status1",
"status2",
"status3"
]
},
{
"status_history" : [
"status4",
"status5",
"new_status_999" // <--- the update result
]
}
]
}
uj5u.com熱心網友回復:
詢問
- 管道更新需要 MongoDB >= 4.2
- 找到陣列的大小
- if size>1 slice 得到 prv else prv=[]
- 連接陣列prv
{"status" "array_with_new_member"}
*我不使用 go,對于 Java,更新方法也接受管道,因此它的作業很簡單,在最壞的情況下,您可以將其用作更新命令。
測驗代碼在這里
update({},
[{"$set":{"size":{"$size":"$rides"}}},
{"$set":
{"rides":
{"$concatArrays":
[{"$cond":
[{"$gt":["$size", 1]},
{"$slice":["$rides", 0, {"$subtract":["$size", 1]}]}, []]},
[{"status_history":
{"$concatArrays":
[{"$cond":
[{"$gt":["$size", 0]},
{"$arrayElemAt":
["$rides.status_history", {"$subtract":["$size", 1]}]},
[]]}, ["new-status"]]}}]]}}},
{"$unset":["size"]}])
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/347806.html
