Mongodb 如何在嵌入式数组中更新后返回新值?

Mongodb 如何在嵌入式数组中更新后返回新值?,mongodb,mongodb-query,Mongodb,Mongodb Query,给定以下MongoDB集合: { "_id": ObjectId("56d6a7292c06e85687f44541"), "name": "My ranking list", "rankings": [ { "_id": ObjectId("46d6a7292c06e85687f55542"), "name": "Ranking 1", "score": 1 },

给定以下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或更高版本,则需要使用和使用投影选项指定要返回的字段子集。您还需要将
returnNewDocument
设置为
true
。当然,这里需要使用投影操作符,因为不能使用位置投影并返回新文档

正如有人指出的那样:

您应该使用,因为它在每个官方语言驱动程序中都被高度强调为不推荐。另一件事是
.findOneAndUpdate()
的驱动程序的语法和选项非常一致。使用
.findAndModify()
,大多数驱动程序不会使用带有“查询/更新/字段”键的同一个对象。因此,当有人使用另一种语言来保持一致性时,就不会那么令人困惑了。
.findOneAndUpdate()
的标准化API更改实际上对应于服务器版本3.x,而不是3.2.x。完全不同的是,shell方法在实现该方法时实际上落后于其他驱动程序(这一次!)。因此,大多数驱动程序实际上都有一个与3.x版本相对应的重大版本起伏,并进行了这样的更改

db.collection.findOneAndUpdate(
{ 
“_id”:ObjectId(“56d6a7292c06e85687f44541”),
“排名”:ObjectId(“46d6a7292c06e85687f55543”)
},  
{$inc:{“排名.$.score”:1},
{ 
“投影”:{
“排名”:
“$elemMatch”:{“\u id”:ObjectId(“46d6a7292c06e85687f55543”)}
}
}, 
“returnNewDocument”:true
}
)
从MongoDB 3.0开始,您需要使用和
字段
选项,您还需要在other中将
new
设置为
true
,以返回新值

db.collection.findAndModify({
查询:{
“_id”:ObjectId(“56d6a7292c06e85687f44541”),
“排名”:ObjectId(“46d6a7292c06e85687f55543”)
},     
更新:{$inc:{“排名.$.score”:1},
新:没错,
字段:{
“排名”:
“$elemMatch”:{“\u id”:ObjectId(“46d6a7292c06e85687f55543”)}
}  
}
})
两个查询都产生:

{
“_id”:ObjectId(“56d6a7292c06e85687f44541”),
“排名”:[
{
“_id”:ObjectId(“46D6A7292C06E85687F5543”),
“姓名”:“排名第二”,
“分数”:11分
}
]
}
您可以使用