> db.members.find().pretty();
{
"_id" : ObjectId("5f7b0b13d2339979e7c4d5c8"),
"cid" : "1601899180793",
"sb_cid" : "1601899180809",
"Date" : ISODate("2020-10-05T05:31:23Z"),
"created_at" : "2020-10-05 05:31:23",
"teampoints" : 0,
"status" : 0,
"membersArray" : [
{
"uid" : "1601354624686",
"cid" : "1601899180793",
"total" : 0,
"challenge_video" : [
{
"status" : 1,
"date" : "2019-01-05",
"videoUrl" : ""
},
{
"status" : 0,
"date" : "2019-01-05",
"videoUrl" : ""
}
],
"captain" : 0
}
],
"teamName" : "Team crrew",
"teamid" : "1601899283837",
"__v" : 0
}
> db.members.aggregate([
... {$unwind:"$membersArray"},
... {$unwind:"$membersArray.challenge_video"},
... {$match:{"membersArray.challenge_video.date":"2019-01-05"}},
... {$project:{_id:1,"membersArray.challenge_video.status":1}}
... ]).forEach(function(doc){
... var vstatus = doc.membersArray.challenge_video.status;
... print("doc id:", doc._id);
... print("status:", vstatus);
... db.members.updateMany(
... {"_id": doc._id},
... {$set:{"membersArray.$[].challenge_video.$[].status":"99"}},
... {upsert:true}
... );
... });
doc id: ObjectId("5f7b0b13d2339979e7c4d5c8")
status: 1
doc id: ObjectId("5f7b0b13d2339979e7c4d5c8")
status: 0
>
> db.members.find().pretty();
{
"_id" : ObjectId("5f7b0b13d2339979e7c4d5c8"),
"cid" : "1601899180793",
"sb_cid" : "1601899180809",
"Date" : ISODate("2020-10-05T05:31:23Z"),
"created_at" : "2020-10-05 05:31:23",
"teampoints" : 0,
"status" : 0,
"membersArray" : [
{
"uid" : "1601354624686",
"cid" : "1601899180793",
"total" : 0,
"challenge_video" : [
{
"status" : "99",
"date" : "2019-01-05",
"videoUrl" : ""
},
{
"status" : "99",
"date" : "2019-01-05",
"videoUrl" : ""
}
],
"captain" : 0
}
],
"teamName" : "Team crrew",
"teamid" : "1601899283837",
"__v" : 0
}
> print("MongoDB",db.version());
MongoDB 4.4.1
>
如果你想更新到特定的数组元素试试这个(使用数组过滤器)
> db.members.find().pretty();
{
"_id" : ObjectId("5f7b0b13d2339979e7c4d5c8"),
"cid" : "1601899180793",
"sb_cid" : "1601899180809",
"Date" : ISODate("2020-10-05T05:31:23Z"),
"created_at" : "2020-10-05 05:31:23",
"teampoints" : 0,
"status" : 0,
"membersArray" : [
{
"uid" : "1601354624686",
"cid" : "1601899180793",
"total" : 0,
"challenge_video" : [
{
"status" : 1,
"date" : "2019-01-05",
"videoUrl" : ""
},
{
"status" : 0,
"date" : "2019-01-05",
"videoUrl" : ""
}
],
"captain" : 0
}
],
"teamName" : "Team crrew",
"teamid" : "1601899283837",
"__v" : 0
}
> db.members.aggregate([
... {$unwind:"$membersArray"},
... {$unwind:"$membersArray.challenge_video"},
... {$match:{"membersArray.challenge_video.date":"2019-01-05",
... "membersArray.challenge_video.status":1}
... },
... {$project:{_id:1,
... "membersArray.challenge_video.date":1,
... "membersArray.challenge_video.status":1}
... }
... ]).forEach(function(doc){
... var vstatus = doc.membersArray.challenge_video.status;
... print("doc id:", doc._id);
... print("status:", vstatus);
... db.members.updateOne(
... {"_id":doc._id},
... {$set:{"membersArray.$[].challenge_video.$[elem2].status":"99"}},
... {arrayFilters:[{"elem2.status":1}]}
... );
... });
doc id: ObjectId("5f7b0b13d2339979e7c4d5c8")
status: 1
>
> db.members.find().pretty();
{
"_id" : ObjectId("5f7b0b13d2339979e7c4d5c8"),
"cid" : "1601899180793",
"sb_cid" : "1601899180809",
"Date" : ISODate("2020-10-05T05:31:23Z"),
"created_at" : "2020-10-05 05:31:23",
"teampoints" : 0,
"status" : 0,
"membersArray" : [
{
"uid" : "1601354624686",
"cid" : "1601899180793",
"total" : 0,
"challenge_video" : [
{
"status" : "99",
"date" : "2019-01-05",
"videoUrl" : ""
},
{
"status" : 0,
"date" : "2019-01-05",
"videoUrl" : ""
}
],
"captain" : 0
}
],
"teamName" : "Team crrew",
"teamid" : "1601899283837",
"__v" : 0
}
>