mongodb 更新数据问题
发布于 8 年前 作者 taoerchun 5585 次浏览 来自 问答

下面为数据库存储数据,现在需要更新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”, } ] }

18 回复
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 应该是可以的吧,你可以试试

@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 貌似不行,报错了 mogodb error.png

@taoerchun 仔细看下,括号写错了

@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我是知道的

@NextZeus 呃 你id不知道 怎么查询呢 你想更新数据你总得知道查询条件吧 再说我这也是实例代码 不设计逻辑 From Noder

@taoerchun 你确定是忘记加update关键字了吗 是大括号写的有问题吧 From Noder

@jiangli373 括号确实有问题,但不加query、update关键字也会报错 mong.png

@jiangli373 还有一个返回子文档的问题再次请教 mongodb.png 只有两个students子元素满足要求,但返回了所有的students子元素,能否只返回满足条件的子元素?

@jiangli373 用aggregate完美解决我的问题,果然是高手,应该经常逛stackoverflow吧 mongodb1.png

回到顶部