Подстановочный знак MongoDB в ключе запроса

Можно ли подставить ключ в запросе? Например, учитывая следующую запись, я хотел бы сделать .find({'a.*': 4}) Это обсуждалось здесь https://jira.mongodb.org/browse/SERVER-267, но похоже, что проблема не решена.

{
  'a': {
    'b': [1, 2],
    'c': [3, 4]
  }
}

person Brad    schedule 30.05.2011    source источник
comment
у меня такая же проблема с монго. у меня есть много таких документов: { один: { два: { больше: данные }, а также: { больше: данные } } } когда вы углубляетесь на один уровень в дерево документов, каждый узел на втором уровне является контейнером для документы с последовательной структурой. поэтому я хотел бы иметь возможность искать так: find({'one.*.some.data':5})   -  person rev    schedule 06.01.2012


Ответы (1)


Как просили, это невозможно. Проблема с сервером, на которую вы ссылаетесь, по-прежнему находится в разделе "проблемы, в которых мы не уверены".

В MongoDB есть некоторый интеллект, связанный с использованием массивов, и я думаю, что это часть сложности, связанной с такой функцией.

Возьмите следующий запрос db.foo.find({ 'a.b' : 4 } ). Этот запрос будет соответствовать следующим документам.

{ a: { b: 4 } }
{ a: [ { b: 4 } ] }

Так что же здесь делает «подстановочный знак»? db.foo.find( { a.* : 4 } ) Соответствует ли он первому документу? Что насчет второго?

Более того, что это означает семантически? Как вы описали, запрос фактически "найти документы, в которых любое поле в этом документе имеет значение 4". Это немного необычно.

Есть ли определенная семантика, которую вы пытаетесь достичь? Возможно, изменение структуры документа даст вам нужный запрос.

person Gates VP    schedule 31.05.2011
comment
спасибо, это проясняет. В частности, то, что я хочу сделать, это подстановочный знак только для определенного узла в ветке, то есть любое правильное подполе a. Я не понимаю, как a.* говорит «найти любое поле». Разве это не «найти документы, в которых есть поле верхнего уровня «а» с подполем, соответствующим 4»? - person Brad; 01.06.2011
comment
Я думаю, что путаница здесь связана с подполем. Когда я пишу {a:{b:4,c:2}}, я говорю, что значение a является объектом JSON. Этот объект JSON имеет два ключа b и c. Значение этих ключей равно 4 и 2 соответственно. Когда вы запрашиваете a.*, вы фактически запрашиваете синтаксис, который перебирает все ключи в этом объекте JSON. Вы не просите пройтись по массиву, вы просите пройтись по свойствам объекта. Это немного необычно, поэтому я прошу здесь конкретный вариант использования. - person Gates VP; 01.06.2011
comment
@gates: у меня есть вариант использования. myDocInMongo = {'someUnknownKey':{propToCheck:true}, 'someKnownKey':true}; Теперь я хочу найти этот документ с помощью селектора {someKnownKey:{$exists:true}}, но я также хочу убедиться, что ни один из других ключей не имеет объекта со свойством propToCheck. Итак, например следующее: {'*.propToCheck':{$exists:false}, {someKnownKey:{$exists:true}}} - person doubletap; 03.05.2012