Meteor:meteor-collectionapi PUT会覆盖整个对象,而不仅仅是更新我想要的字段

时间:2013-09-05 03:06:58

标签: api mongodb meteor

我正在尝试使用meteor-collectionapi包来更新我的数据库。我已经设置了一个基本的集合来测试功能。

我从这些数据开始:

{ "name" : "Darrell David", "age" : "18", "gender" : "Male", "_id" : "8BW9Yg2oKByBGdnSa" }
{ "name" : "Julie Smith", "age" : "21", "gender" : "Female", "_id" : "fAaFwCEXLzrmejnJK" }
{ "name" : "Todd Davis", "age" : "32", "gender" : "Male", "_id" : "ixKjhkTmjrNte2DjP" }

现在,我想将第一个玩家的性别更新为“女性”,所以我用CURL称之为:

curl -H "X-Auth-Token: 97f0ad9e24ca5e0408a269748d7fe0a0" -X PUT -d "{\"$set\":{\"gender\":\"Female\"}}" http://localhost:3000/collectionapi/players/8BW9Yg2oKByBGdnSa

我最终得到的是:

{ "_id" : "8BW9Yg2oKByBGdnSa", "" : { "gender" : "Female" } }
{ "name" : "Julie Smith", "age" : "21", "gender" : "Female", "_id" : "fAaFwCEXLzrmejnJK" }
{ "name" : "Todd Davis", "age" : "32", "gender" : "Male", "_id" : "ixKjhkTmjrNte2DjP" }

第一个玩家已被完全覆盖,名称和年龄字段已丢失。

我在这里缺少什么?当我在MongoDB控制台中执行此命令时,它可以完美地运行:

db.players.update(
   { _id: "8BW9Yg2oKByBGdnSa" },
   { $set: { gender: "Female" } }
)

1 个答案:

答案 0 :(得分:1)

我猜bash正在用空的环境变量替换“$ set”

例如。 echo "$set" vs echo "\$set"

所以请将您的PUT命令更新为:

curl -H "X-Auth-Token: 97f0ad9e24ca5e0408a269748d7fe0a0" -X PUT -d "{\"\$set\":{\"gender\":\"Female\"}}" http://localhost:3000/collectionapi/players/8BW9Yg2oKByBGdnSa

默认情况下,如果不存在修饰符,则Collection.update()将替换文档($ set,$ unset,$ push,$ pull等)。因此,发送到服务器的命令是用{"":{"gender":"Female"}}

替换文档