Para o seu primeiro problema, o MongoDB tem upsert assim
db.collection.update(
{query for id},
{document},
{upsert: true}
)
ou no driver Java
yourCollection.update(searchObject, modifiedObject, true, false);
Se você quiser definir um ID personalizado, basta definir o
_id
chave manualmente, ou seja yourBasicDBObject.put("_id",yourCustomId)
você só precisa garantir que seja exclusivo para cada documento.
Você também precisará definir o
_id
em seu modifiedObject
caso contrário, um novo será gerado. Quanto às operações em massa , basta definir um ID personalizado para cada documento fornecendo o
_id
chave também deve funcionar.