j3d*_*j3d 7 mongodb mongodb-query
鉴于以下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
},
]
}
Run Code Online (Sandbox Code Playgroud)
以下是我如何提高给定排名的得分:
db.collection.update(
{ "_id": ObjectId("56d6a7292c06e85687f44541"), "rankings._id" : ObjectId("46d6a7292c06e85687f55543") },
{ $inc : { "rankings.$.score" : 1 } }
);
Run Code Online (Sandbox Code Playgroud)
我如何获得新的分数值?在上一个查询中,我将第二个排名从10增加到11 ...如何在更新后获得这个新值?
sty*_*ane 12
如果您使用的是MongoDB 3.0或更高版本,则需要使用.findOneAndUpdate() and use projection选项指定要返回的字段子集.您还需要设置returnNewDocument为true.当然,您需要在$elemMatch此处使用投影操作符,因为您无法使用位置投影并返回新文档.
有人指出:
你应该使用
.findOneAndUpdate()因为.findAndModify()在每个官方语言驱动程序中被弃用.另一件事是语法和选项在驱动程序之间非常一致.findOneAndUpdate().使用时.findAndModify(),大多数驱动程序不使用带有"query/update/fields"键的相同单个对象.因此,如果某人申请另一种语言以保持一致,那就不那么容易混淆了.标准化的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
}
)
Run Code Online (Sandbox Code Playgroud)
从MongoDB的3.0起,您需要使用findAndModify和fields选项也需要设置new到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") }
}
}
})
Run Code Online (Sandbox Code Playgroud)
两个查询都产生:
{
"_id" : ObjectId("56d6a7292c06e85687f44541"),
"rankings" : [
{
"_id" : ObjectId("46d6a7292c06e85687f55543"),
"name" : "Ranking 2",
"score" : 11
}
]
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2430 次 |
| 最近记录: |