如果您使用的是 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
}
]
}