嵌入式数组更新后如何取回新值?

2023-12-22

给定以下 MongoDB 集合:

{
    "_id": ObjectId("56d6a7292c06e85687f44541"),
    "name": "My ranking list",
    "rankings": [
        {
            "_id": ObjectId("46d6a7292c06e85687f55542"),
            "name": "Ranking 1",
            "score": 1
        },
        {
            "_id": ObjectId("46d6a7292c06e85687f55543"),
            "name": "Ranking 2",
            "score": 10
        },
        {
            "_id": ObjectId("46d6a7292c06e85687f55544"),
            "name": "Ranking 3",
            "score": 15
        },
    ]
}

以下是我如何提高给定排名的分数:

db.collection.update(
    { "_id": ObjectId("56d6a7292c06e85687f44541"), "rankings._id" : ObjectId("46d6a7292c06e85687f55543") },
    { $inc : { "rankings.$.score" : 1 } }
);

如何获得新的分数值?在上一个查询中,我将第二排名从 10 增加到 11...更新后如何取回这个新值?


如果您使用的是 MongoDB 3.0 或更高版本,则需要使用.findOneAndUpdate() https://docs.mongodb.org/manual/reference/method/db.collection.findOneAndUpdate/#db-collection-findoneandupdate并使用projection指定要返回的字段子集的选项。您还需要设置returnNewDocument to true。当然你需要使用$elemMatch https://docs.mongodb.org/manual/reference/operator/projection/elemMatch/此处的投影运算符是因为您无法使用位置投影并返回新文档。

正如有人指出的:

你应该使用.findOneAndUpdate() https://docs.mongodb.org/manual/reference/method/db.collection.findOneAndUpdate/#db-collection-findoneandupdate因为.findAndModify() https://docs.mongodb.org/manual/reference/command/findAndModify/在每个官方语言驱动程序中都被突出显示为已弃用。另一件事是,语法和选项在各个驱动程序中非常一致.findOneAndUpdate(). With .findAndModify(),大多数驱动程序不使用带有“查询/更新/字段”键的相同单个对象。因此,当有人为了保持一致而应用另一种语言时,就不会那么混乱了。标准化 API 更改.findOneAndUpdate()实际上对应于服务器版本 3.x 而不是 3.2.x。完全的区别在于 shell 方法在实现该方法时实际上落后于其他驱动程序(这一次!)。因此,大多数驱动程序实际上都有一个与 3.x 版本相对应的重大版本更新,并进行了此类更改。

db.collection.findOneAndUpdate( 
    { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
         "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },  
    { $inc : { "rankings.$.score" : 1 } },  
    { 
        "projection": { 
            "rankings": { 
                "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") } 
            }
        }, 
        "returnNewDocument": true 
    }
)

从 MongoDB 3.0 开始,您需要使用findAndModify https://docs.mongodb.org/manual/reference/command/findAndModify/fields您还需要设置选项new to true在其他中返回新值。

db.collection.findAndModify({   
    query: { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
        "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },     
    update: { $inc : { "rankings.$.score" : 1 } },       
    new: true,  
    fields: { 
        "rankings": { 
            "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
        }  
    }
})

两个查询都会产生:

{
        "_id" : ObjectId("56d6a7292c06e85687f44541"),
        "rankings" : [
                {
                        "_id" : ObjectId("46d6a7292c06e85687f55543"),
                        "name" : "Ranking 2",
                        "score" : 11
                }
        ]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式数组更新后如何取回新值? 的相关文章

  • 猫鼬中的数组过滤器

    将查询转换为节点 arrayfilter 在 mongoose 中工作的版本或者如何在节点应用程序中运行它们 db getCollection student update id ObjectId 5a377d62d21a3025a3c3a
  • 使用 Typescript 时的 MongoDB FindOptions

    我正在将 JS 项目转换为 TS 并且在查询集合时遇到 FindOptions 问题 我只想获取集合中所有元素的 ID 这是导致 TS 错误的 TS 代码 import Collection Db Document MongoClient
  • 在 MongoDB Java 驱动程序中如何使用 $filter

    我有一个适用于 MQL 的查询 我需要将其翻译成Java MQL 中的查询如下所示 db
  • 我需要显式关闭连接吗?

    我持有一个实例MongoClient and DB在我的应用程序中 每次我想执行某些操作时 我都会调用getCollection 我想知道是否需要显式关闭连接 就像connection close 在 JDBC 中 强调一下 我只有一个Mo
  • 如何使用 mongodb 处理多个操作并获取计数?

    在这里 我为图表中的显示计数日期创建了一个查询 我已经使用了mongodb 我有一个对象 在该对象中存储多个数据并用一个值分隔Action 我想显示计数日期明智的操作 例如评论 就像两个操作计数都想显示一样 现在我只是显示评论数 我也想得到
  • 在Spring-Boot中,我们如何在同一个项目中连接两个数据库(Mysql数据库和MongoDB)?

    我正在尝试创建一个 Spring Boot 项目 其中我有一个要求 我想连接到不同的数据库 MySql 和 MongoDB 我是否需要做一些特殊的事情来连接到这两个数据库 或者 spring boot 会自动计算出自己连接到这两个数据库 我
  • 如何将 CSV 文件中的数据导入到服务器端的 Meteor 集合中

    我正在尝试为我之前的帖子找到解决方案 Mongo 在 Meteor 应用程序中的 id 字段上给出重复键错误 https stackoverflow com questions 28961281 mongo gives duplicate
  • 在 MongoDB 中删除时自动删除引用对象

    假设我有一个这样的架构 var Person new Schema name String var Assignment new Schema name String person ObjectID 如果我删除一个人 仍然可能会留下引用不存
  • MongoDB - 使用聚合框架或 MapReduce 来匹配文档中的字符串数组(配置文件匹配)

    我正在构建一个可以比作约会应用程序的应用程序 我有一些结构如下的文档 db profiles find pretty id 1 firstName John lastName Smith fieldValues favouriteColou
  • 将 ObjectId 字段正确映射到字符串

    我正在对 RDBMS 世界进行一些探索 进入 MongoDB 的神秘海洋 我正在使用 Spring Data 来帮助我进行冒险 我需要在两个集合中的文档之间创建手动引用 我读到 DBRef 很昂贵 我的 pojo 是这样的 public c
  • NoSQL(MongoDB)与 Lucene(或 Solr)作为数据库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 随着基于文档数据库的 NoSQL 运动的发展 我最近关注了 MongoDB 我注意到如何将项目视为 文档 就像 Lucene 以及 Solr 用
  • MongoDB req.body 问题

    我有一个非常简单的 Mongo 设置 如下所示 这非常适合从输入字段获取数据并保存数据 一切都在工作 我的问题 我将如何循环遍历前端的 jobs 变量并设置数据 以便它适用于我的模型 不知何故 我需要将其输入到输入中 以便我可以 req b
  • mongodb/node.js 中单文档并发读写操作的问题

    编辑 6 15我尝试运行相同的代码 在调用之前添加延迟 doSafePush 再次收到 ConcurrencyDBError 时 即执行return when resolve wait delay 35 then function doSa
  • mongodb C# 异常无法从 BsonType Int32 反序列化字符串

    我是在 C 中使用 mongo db 的新手 但我正在尝试在 mongo db 中导入大型数据库 MyDb 由仅具有简单参数 Id Body Title Tags 的实体组成 这是 mongo 中实体的示例 Id someff asdsa
  • 猫鼬查找并删除

    我正在尝试删除满足查询的多个文档 但是 我需要这些文档的数据将它们存储在单独的集合中以实现撤消功能 我让它工作的唯一方法是使用多个查询 Data find query exec function err data Data remove q
  • 下一个和上一个文档

    我正在制作一个图片库 每个图像都有一个 id 当我查看图像时 我想要接下来的 3 个图像和之前的 3 个图像 我怎样才能在 mongodb 查询中得到这个 我认为我可以使用 sort by id 因为这是不可排序的 也许使用mapReduc
  • 是否可以将 mongodb 与 sqlalchemy 一起使用?

    我在中找不到任何有关连接 mongodb 的信息sqlalchemy 的文档 http docs sqlalchemy org en latest 和谷歌搜索 是否可以将 mongodb 与 sqlalchemy 一起使用 谢谢 根据 sq
  • 如何在 mongodb-native findAndModify 中使用变量作为字段名称?

    在使用 mongodb native 驱动程序的这段代码中 我想增加在单独变量中指定的字段的值 问题在于 在这种情况下 inc 子句中的字段名称将是 变量 而不是变量的内容 在查询部分中 所选变量按预期工作并找到正确的 ID var sel
  • 服务器发现和监控引擎已弃用

    我在 Node js 应用程序中使用 Mongoose 这是我的配置 mongoose connect process env MONGO URI useNewUrlParser true useUnifiedTopology true u
  • Mongoose查询结果是只读的吗?

    如何修改 Mongoose 查询返回的对象 假设我们有以下模式 var S new mongoose Schema name String field String 我对结果进行了以下查询和修改 var retrieve function

随机推荐