2015-04-20 5 views
2

Допустит, у меня есть документ, структурированный таким образом:Update данного Монго поле в неизвестных родителях полого

datas: { 
    foo: { 
     ... 
     keytoupdate: [...] 
    }, 
    whatever: { 
     ... 
     keytoupdate: [...] 
    }, 
    anystring: { 
     ... 
     keytoupdate: [...] 
    }, 
    ...: { 
     ... 
     keytoupdate: [...] 
    } 
} 

Я знаю, что:

  • Каждого прямой потомок свойство «данных» документ имеет поле «keytoupdate».
  • Прямые дочерние свойства документа «datas» варьируются от случая к случаю: не обязательно одно и то же имя, ни одного номера.

Я хочу обновить каждое поле «keytoupdate», независимо от того, сколько из них есть.

Вопрос в следующем: Как я могу это сделать? Есть ли какой-нибудь волшебный оператор, например, $ that does the same job for Array?

Спасибо!

+1

обходной путь будет перепроектировать схему таким образом, что ключи становятся частью значений свойств, так как это довольно сложно выдавать запросы против динамических ключей. Возможно, вы захотите увидеть этот [** SO вопрос **] (http://stackoverflow.com/questions/29745878/mongo-match-where-object-key-is-variable) для получения дополнительной информации о том, как вы можете это – chridam

+0

@chridam К сожалению, я не могу перепроектировать схему, она встроена в очень большую структуру: s –

+0

Это не имеет смысла - если вы не знаете имя ключа выше 'keytoupdate', t знать, в каком поле вам нужно запрашивать/обновлять. В приведенном выше документе нет поля «keytoupdate»; существует только 'key1.keytoupdate',' key2.keytoupdate' и т. д. Можете ли вы сформулировать свой вопрос так, чтобы он был корректным? Какое точное преобразование запроса и/или документа вы хотели бы сделать? – wdberkeley

ответ

2

Я отвечу на свой вопрос: Невозможно это сделать, мы не можем играть с динамическими клавишами, просто забудьте об этом! Но есть 2 обходные пути:

  1. Лучшее решение, как это было предложено @chridam, чтобы перестроить схему, чтобы сделать массив объектов, где ключи являются частями массивов, вы можете увидеть this question for more details.
  2. Если вы не можете, другое (но не хорошее) решение должно сделать запрос для каждого поля, которое может быть в вашем документе, вместо того, чтобы пытаться сделать это одним запросом. Это очень плохое решение, особенно если в вашем документе может быть много полей, и вы должны знать, какие поля могут быть в ваших документах. Это плохое решение, абсолютно не оптимизирован, но он имеет преимущество, что является простой в реализации
Смежные вопросы