Потому что в JSON и BSON порядок полей имеет значение при сериализации.Т.е.
{ city: "New York", state: "NY" }
- это не то же самое, что
{ state: "NY" , city: "New York" }
Фактически индексируемым значением будет «New YorkNY» в первом случае и «NYNew York» во втором (примерно),Поскольку нет никакой схемы, позволяющей нормализовать порядок полей перед поиском во встроенном документе в индексе.
Чтобы преодолеть это, вы можете использовать составной индекс:
db.factories.ensureIndex( { "metro.city": 1, "metro.state": 1 })
и выполнить запрос с (здесь порядокне имеет значения):
db.factories.find( { "metro.city": "New York", "metro.state": "NY" } )