【问题标题】:I want to update the document in collection in mongodb我想在 mongodb 中更新集合中的文档
【发布时间】:2020-10-22 22:05:30
【问题描述】:

这里有 1 个文档,其中 memberArray 是具有多个 challeng_video 对象数组的列 我想更新memberArraay的challenge_video中的状态,对应于我可以做什么的日期

{
    "_id" : ObjectId("5f7b0b13d2339979e7c4d5c8"),
    "cid" : "1601899180793",
    "sb_cid" : "1601899180809",
    "Date" : ISODate("2020-10-05T11:01:23.000+05:30"),
    "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
}

【问题讨论】:

标签: arrays mongodb mongoose


【解决方案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"}},
... {$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
}
>

【讨论】:

  • 嗨,它确实更新了整个状态,但我想更新我在匹配条件中给出的日期的状态
  • check-in "challenge_video" 你有一个相似的文档,没有区别,因此它更新了两条记录。如果您有任何标识符可以将状态字段标识为唯一,请告诉我。我们可以在匹配查询中添加它。
  • 是的,如果我有两个不同的日期,那我们该怎么办
  • 我有状态 3 我必须更新 2 我怎么能
  • "message": "在路径 'membersArray.$[].challenge_video.$[c].status ````````` 中找不到标识符 'c' 的数组过滤器现在它说
【解决方案2】:

这对我有用,如果它对你有用,请告诉我

db.members.updateMany({'cid': item.cid},
{ '$set':
{ 'membersArray.$[].challenge_video.$[ele].status' : 3}},
{arrayFilters: [{'ele.date': "2020-10-05",'ele.status':0}]}   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多