2014-12-29 3 views
0

Если у меня есть документ следующим образом:Агрегирование фильтра для ключей

{ 
    "_id" : ObjectId("54986d5531a011bb5fb8e0ee"), 
    "owner" : "54948a5d85f7a9527a002917", 
    "type" : "group", 
    "deleted" : false, 
    "participants" : { 
      "54948a5d85f7a9527a002917" : { 
        "last_message_id" : null 
      }, 
      "5491234568f7a9527a002917" : { 
        "last_message_id" : null 
      } 
      "1234567aaaa7a9527a002917" : { 
        "last_message_id" : null 
      } 
    }, 
    } 

Как сделать простой фильтр для всех документов этого у участника «54948a5d85f7a9527a002917»?

Благодаря

ответ

1

Попытка запроса структур, как это не очень хорошо работает. Существует целый ряд проблем с таким моделированием, но наиболее явная проблема заключается в использовании «данных» в качестве имен для «ключей».

Постарайтесь немного подумать о РСУБД, как, по крайней мере, в понятиях ограничений на то, что база данных не может или не должна делать. Вы бы не разработали «таблицу» в схеме, которая теперь имела бы название «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», как и у вас. Это основное правило хэширования, которое нарушается там.

Смежные вопросы