While I undertand a foreign key constraint would not make sense for a NoSql database, should it not ensure that it updates the indexes if it allows me to rename fields?
http://www.mongodb.org/display/DOCS/Updating#Updating-%24rename
{ $rename : { old_field_name : new_field_name } }
but if I had
db.mycollections.ensureIndex({old_field_name:1});
wouldn’t it be great if the index was updated automatically?
Is it that since system.indexes is simply just another table and such a automatic update would imply a foreign key constraint of sorts, the index update is not done? Or am I missing certain flags?
Quoting Mike O’ Brien:
The $rename operator is analogous to doing a $set/$unset in a single atomic operation. It’s a shortcut for situations where you need to take a value and move it into another field, without the need to do it in 2 steps (one to fetch the value of the field, another to set the new one).
Doing a $rename does mean the data is changing. If I use $rename to rename a field named “x” to “y”, but the field named “y” already existed in the document, the old value for “y” is overwritten, and the field “x” will no longer exist anymore. If either “x” or “y” is indexed, then the operation will update those indexes to reflect the final values resulting from the operation. The same applies when using rename to move a field from within an embedded document up to the top level (e.g. renaming “a.b” to “c”) or vice versa.
The behavior suggested in the SO question (i.e., renaming a field maintains the relationship between the field it was moved to and its value in the index) then things can get really confusing and make it difficult to reason about what the “correct” expected behavior is for certain operations. For example, if I create an index on field “A” in a collection, rename “A” to “B” in one of the documents, and then do things like:
update({“A” : }, {“$set”:{“B”:}}) // find a document where A= and set its value of B to
update({“B” : }, {“$set”:{“A”:}}) // find a document where B= and set its value of A to
Should these be equivalent?
In general, having the database maintain indexes across a collection by field name is a design decision that keeps behavior predictable and simple.