Попытка запроса структур, как это не очень хорошо работает. Существует целый ряд проблем с таким моделированием, но наиболее явная проблема заключается в использовании «данных» в качестве имен для «ключей».
Постарайтесь немного подумать о РСУБД, как, по крайней мере, в понятиях ограничений на то, что база данных не может или не должна делать. Вы бы не разработали «таблицу» в схеме, которая теперь имела бы название «54948a5d85f7a9527a002917» в качестве имени столбца? Но это, по сути, то, что вы здесь делаете.
MongoDB может запросить, но не эффективным способом:
db.collection.find({
"participants.54948a5d85f7a9527a002917": { "$exists": true }
})
Естественно, это выглядит для «присутствия» ключа в данных. Хотя форма запроса доступна, она не позволяет эффективно использовать такие вещи, как индексы, доступные в качестве индексов для «данных», а не «ключевые» имена.
Лучше структура и подход заключается в следующем:
{
"_id" : ObjectId("54986d5531a011bb5fb8e0ee"),
"owner" : "54948a5d85f7a9527a002917",
"type" : "group",
"deleted" : false,
"participants" : [
{ "_id": "54948a5d85f7a9527a002917" },
{ "_id": "5491234568f7a9527a002918" },
{ "_id": "1234567aaaa7a9527a002917" }
]
}
Теперь «данные» вы ищете актуально «данные», связанные с «ключом» (возможно), так и внутри массива для привязки к родительский объект. Это гораздо эффективнее запроса:
db.collection.find({
"participants._id": "54948a5d85f7a9527a002917"
})
Это гораздо лучше моделировать таким образом, чем то, что вы сейчас делаете, и это имеет смысл к потреблению предметов.
BTW. Вероятно, это просто вырезать и вставить в ваш вопрос, но вы не можете дублировать такие ключи, как «54948a5d85f7a9527a002917», как и у вас. Это основное правило хэширования, которое нарушается там.