我的命令是这样的:
db.item.remove()
db.item.update({_id:{$in:['A1','A2']}},{$inc:{count:1}},{multi: true, upsert: true})
我想要的结果应该是
db.item.find() -->
{_id: 'A1', count: 1}
{_id: 'A2', count: 1}
但事实上它是:
{_id: ObjectId(xxx), count: 1}
{_id: ObjectId(xxx), count: 1}
似乎Upsert无法自动使用查询arrary中的val作为新文档的_id, 有没有办法达到我的目的?
答案 0 :(得分:2)
您一次只能竖立一个文档,因此需要将其拆分为两个update
个来电。
db.item.update({_id: 'A1'},{$inc:{count:1}},{upsert: true})
db.item.update({_id: 'A2'},{$inc:{count:1}},{upsert: true})
答案 1 :(得分:0)
这取决于文件是否已经存在。如果没有,那么您可以始终使用BatchInsert
,其中最新的MongoDB已委派给insert
函数:http://docs.mongodb.org/manual/applications/create/#insert
如果将一组文档传递给insert()方法,insert()将执行批量插入到集合中。
因此,copuld是一种可行的方式,但是你的文件非常小,在一个命令中完成所有这一切的唯一真正好处是你得到一次往返但是你必须通过网络发送你的所有数据同时。
我还应该注意,在分片下进行批量插入更改时,您应该考虑一些注意事项:http://docs.mongodb.org/manual/administration/sharding/#strategies-for-bulk-inserts-in-sharded-clusters,因为批量插入可能会对您的系统产生性能影响。
但是如果文件可能已经存在,那么唯一的方法是手动执行命令,如@JohnnyHK所说。我不认为MongoDB中的任何其他工具(如mongoimport
)会对您有所帮助,因为那些工具也会批量插入。