On Mon, Oct 24, 2016 at 9:27 AM, Ram <sourceopen@gmail.com> wrote:
I am not sure I understood a few things you said like, [...]
Does this, [...] mean I would need to iterate using the unique key 
and find the object I want to update and change this non-unique key to the new one?

No. Perhaps the pseudo C++11 code below will help?
Lets assume your unique index is the first index (index = 0),
and the non-unique one is second index (index = 1).

using bmi_t = ...;
bmi_t& bmi = /*get the BMI container*/;
auto& uniq_idx = bmi.get<0>();
auto unique_idx_iter = uniq_idx.find(uniq_key);
if (unique_idx_iter == uniq_idx.end()) return;
auto nonunique_iter = bmi.project<1>(unique_idx_iter);
auto& nonuniq_idx = bmi.get<0>();
bool ok = nonuniq_idx.modify(nonunique_iter, [&new_value](bmi_t::value_type& element) {
  element.setNonUniqueIdString(new_value);
});

if the modification could be veto'd by any of your indexes,
you'd probably use the overload with a Rollback functor.

For actual code, I'm sure there's an example in your Boost install. --DD

PS: If you don't have a unique index and unique key for your element,
then indeed you need to iterate on your container (or non-unique index),
and figure out in an ad-hoc way which exact element you want to modify.
(and need to project<1>() only if not iterating on the index you want to modify).