下面为数据库存储数据,现在需要更新userId= ObjectId(“55546f25a668fa781d00000a”)的userName db.test.findAndModify({students.userId:ObjectId(“55546f25a668fa781d00000a”)},{更新语句}) 一般的做法是将students字段查出来,再赋值新的userName,再将整个students字段更新,因为该字段数据量较大,全部更新效率太低 请教各位是否有更好的方法?谢谢! test表 { "_id" : ObjectId(“562df55f82099a923c911dd8”), “students” : [ { “userId” : ObjectId(“55546f25a668fa781d00000a”), “userName” : “莫扎特”, }, { “userId” : ObjectId(“55548b3c7309cf4c26000006”), “userName” : “莫扎特2”, } ] }
db.test.update(
{ students.userId:ObjectId(“55546f25a668fa781d00000a”) },
{ $set: { "students.$.userName" : "xxxxxxxxx" } }
)
https://docs.mongodb.com/manual/reference/operator/update/positional/#up.S
@jiangli373 非常感谢!
@jiangli373 这种用法findAndModify不支持吧?
@taoerchun 应该是可以的吧,你可以试试
db.test.findOne()
{
"_id" : ObjectId("57c00bef6a387885a44f07ce"),
"students" : [
{
"id" : 1,
"userName" : "a"
},
{
"id" : 2,
"userName" : "b"
}
]
}
db.test.findAndModify({“query”:{“students.id”:2},“update”:{"$set":{“students.$.userName”:“c”}},upsert: true})
db.test.findOne()
{
"_id" : ObjectId("57c00bef6a387885a44f07ce"),
"students" : [
{
"id" : 1,
"userName" : "a"
},
{
"id" : 2,
"userName" : "c"
}
]
}
https://docs.mongodb.com/v3.0/reference/method/db.collection.findAndModify/
@jiangli373 貌似不行,报错了
@taoerchun 仔细看下,括号写错了
db.test.findAndModify({
“query”:{“students.id”:2},
“update”:{"$set":{“students.$.userName”:“c”}},
upsert: true
})
@jiangli373 忘加update关键字了。
@jiangli373 id不是自己想知道,说知道就知道的。 这个方法有点死。
{ _id: 4, grades: [ { grade: 80, mean: 75, std: 8 }, { grade: 85, mean: 90, std: 5 }, { grade: 90, mean: 85, std: 3 } ] } Use the positional $ operator to update the value of the std field in the embedded document with the grade of 85:
db.students.update( { _id: 4, “grades.grade”: 85 }, { $set: { “grades.$.std” : 6 } } )
@NextZeus 什么意思?id我是知道的
@taoerchun 你确定是忘记加update关键字了吗 是大括号写的有问题吧 From Noder
@jiangli373 括号确实有问题,但不加query、update关键字也会报错
@jiangli373 还有一个返回子文档的问题再次请教 只有两个students子元素满足要求,但返回了所有的students子元素,能否只返回满足条件的子元素?
@jiangli373 用aggregate完美解决我的问题,果然是高手,应该经常逛stackoverflow吧