我这样的命令:
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无法自动使用查询递质中的val作为新文档的_id,有没有办法实现我的目标?
您一次只能上升一个文档,因此您需要将其拆分为两个update
调用。
db.item.update({_id: 'A1'},{$inc:{count:1}},{upsert: true})
db.item.update({_id: 'A2'},{$inc:{count:1}},{upsert: true})
这取决于文档是否已经存在。如果不这样做,那么您始终可以使用BatchInsert
,其中最新的MongoDB中已委派给insert
函数:http://docs.mongodb.org/manual/applications/create/create/#insert
如果将文档数组传递给insert()方法,则insert()在集合中执行批量插入。
使得Copuld是一种方法,但是您的文档是如此之小,您从一个命令中完成这一切的唯一真正的好处是您获得一次往返,但是您必须通过电线将所有数据发送同时。
我还应该注意,在碎片下进行批处理插入更改,并且有某些考虑,您可能应该考虑:http://docs.mongodb.org/manual/administration/sharding/sharding/#strategies-for-bulk-interts-for-bulk-interts - 由于性能影响大量插入物可能会对您的系统产生影响。
,如果文档可能已经存在,那么唯一的唯一方法就是像@johnnyhk所说的那样手动执行命令。我不认为任何其他工具(例如mongoimport
)会在这里为您提供帮助。