在Mongo CLI中使用修饰符操作符进行更新,但不能使用mongoose从node.js代码中进行更新

使用CLI连接到我们的Mongo实例,你可以使用update修饰符运算符:

db.users.update({昵称:'mcoalson'},{“$ addToSet”:{room_ref:“b”}})db.users.update({昵称:'mcoalson'},{“$ addToSet” room_ref:“c”}})db.users.findOne({昵称:'mcoalson'}){“_id”:ObjectId(“4de5e9e982e9556c2a000003”),“nickname”:“mcoalson”,“room_ref”:[“a” ,“d”,“b”,“c”]}

但是,在同一个文档中的node.js中做同样的事情是没有结果的。

db.User.update({'nickname': 'mcoalson'}, {"$pullAll": {'room_ref': ["b"]}}); db.User.update({'nickname': 'mcoalson'}, {"$addToSet": {'room_ref': "f"}}); 

“room_ref”:[“a”,“d”,“b”,“c”]

显然“b”没有被删除,“f”没有被添加。 我尝试了所有我能想到的可以想象的引用场景,但是没有任何变化。 我可以使用node.js代码中的find()和findOne(),并使用相同的凭据,任何build议吗?

抱歉耽搁了。

mongo CLI是同步的,node.js是asynchronous的。 你是否使用了你发布的代码,或者你有适当的callback? 你的testing应该是这样的:

 db.User.update({'nickname': 'mcoalson'}, {"$pullAll": {'room_ref': ["b"]}}, function(){ db.User.findOne({'nickname': 'mcoalson'}, function(user){ console.log('changed user:', user) }) }) 

我遇到了同样的问题,最终绕过了mongoose,并使用了其中没有发生问题的底层驱动程序。

所以,而不是

 db.User.update(...) 

使用:

 db.User.collection.update(...) 

希望有所帮助。