账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    MongoDB嵌套文档如何局部更新
    36
    0

    MongoDB中,有如下的一条数据,我想修改,workerStats.stage=LABEL and workerStats.idOfWorker=admin的stats里面的labeledItems,使其自增1。

    {
        "_id" : ObjectId("5ac1ff4c87c0fc67c0f4fe60"),
        "_class" : "com.JobEntity",
        "workerStats" : [ 
            {
                "idOfWorker" : "admin",
                "stage" : "LABEL",
                "stats" : {
                    "totalItems" : 0,
                    "labeledItems" : 0,
                    "submittedItems" : 0
                }
            }, 
            {
                "idOfWorker" : "lgh",
                "stage" : "REVIEW",
                "stats" : {
                    "totalItems" : 0,
                    "labeledItems" : 0,
                    "submittedItems" : 0
                }
            }
        ]
    }

    我的修改语句如下:

    db.job.updateOne(
    {
        "_id": ObjectId("5ac1ff4c87c0fc67c0f4fe60"),
        "workerStats.stage": "LABEL",
        "workerStats.idOfWorker": "admin"
    },
    {
        $inc: {
            "workerStats.$.stats.labeledItems": 1
        }
    }
    )

    但是并不起作用,请问应该如何修改?

    0
    打赏
    收藏
    点击回答
        全部回答
    • 共 0 条
    • ジ世中沉沦〆 普通会员 1楼

      在MongoDB中,嵌套文档(document nests)是MongoDB文档的一个特殊类型,它可以包含多个文档嵌套在一个单独的集合中。局部更新(局部更新)是指在当前文档中局部地更改一个或多个文档的值,而不是整个文档。以下是在MongoDB中局部更新的步骤:

      1. 定义嵌套文档: 在MongoDB中,每个文档都包含一个名为 _id 的字段,这是文档的唯一标识符。以下是一个简单的嵌套文档示例:

      json { "_id": "1", "name": "Alice", "age": 30, "address": { "street": "123 Main St", "city": "Anytown", "state": "CA" } }

      1. 定义子文档: 为了更新嵌套文档中的某个值,你需要在子文档中包含与原始文档具有相同 _id 字段的字段。例如,如果你想更新嵌套文档中的 age 字段,你可以创建一个子文档并设置它的 age 属性:

      json { "_id": "1", "name": "Alice", "age": 30, "address": { "street": "123 Main St", "city": "Anytown", "state": "CA" }, "children": [ { "_id": "100", "name": "Bob", "age": 15 }, { "_id": "101", "name": "Charlie", "age": 12 } ] }

      1. 创建局部更新查询: 使用 updateOne 或 updateMany 函数来局部更新文档。以下是一个使用 updateOne 函数的示例:

      ```javascript var updatedDocument = db.collection.updateOne( { _id: "1" }, { $set: { "address.street": "Updated Street", "address.city": "Updated City", "address.state": "Updated State" } } );

      if (updatedDocument.insertedCount === 0) { db.collection.updateMany( { _id: "1" }, { $set: { "address.street": "Old Street", "address.city": "Old City", "address.state": "Old State" } } ); } ```

      1. 更新文档: 使用 insertOne 函数将更新的文档插入到集合中,而不会影响到已存在的文档。例如,以下代码将更新嵌套文档中的 address.street 属性:

      ```javascript db.collection.updateOne( { _id: "1" }, { $set: { "address.street": "Updated Street" } } );

      var updatedDocument = db.collection.updateOne( { _id: "1" }, { $set: { "address.street": "New Street" } } );

      if (updatedDocument.insertedCount === 0) { db.collection.updateMany( { _id: "1" }, { $set: { "address.street": "Old Street", "address.city": "Old City", "address.state": "Old State" } } ); } ```

      在这个例子中,updatedDocument 数组中的第一个元素包含嵌套文档中的 address 对象,其 street 属性被更新为 "Updated Street"。第二个元素包含嵌套文档中的第二个 address 对象,其 street 属性也被更新为 "New Street"。如果没有插入任何新的文档,则updatedDocument 数组中的第二个元素也会被插入,因为嵌套文档中不存在其他文档的 address 对象。

      请注意,局部更新通常用于在特定部分更新文档,而不是在整个文档中更改所有值。如果在文档中频繁地更改子文档中的值,你可能需要使用其他方法,如批量插入或实时更新。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部