2015-11-10 3 views
2

У меня есть документ следующим образом:MongoDB элемент массива фильтров во вложенном объекте

{ 
    "_id" : ObjectId("56423b2558cb340599108b35"), 
    "test" : { 
     "source" : [ 
      { 
       "member" : "abc" 
      }, 
      { 
       "member" : "xyz" 
      } 
     ] 
    } 
} 

Я хочу, чтобы фильтровать на элементе массива А, и я пытаюсь следующий запрос:

db.coll .find ({"test.source.member": "xyz"}, {"test.source. $. member": true}). pretty()

По-видимому, он работал на 2.4, на 2.6 не работает,

В 2.4 он возвратил "xyz" , тогда как на 2.6 он возвращает «abc», то есть первый элемент. Есть ли способ фильтровать «abc», потому что в конце концов я хочу обновить. Кстати, я тоже пробовал с $ elemMatch и, похоже, давал тот же результат «abc».

Спасибо.

+0

Опубликованный 'код' определенно не C, поэтому, пожалуйста, удалите тег 'c' – user3629249

ответ

1

Согласно Docs, если вы работаете в 2.6, это должно дать вам правильный вывод:

db.coll.find({ "test.source.member" : "xyz"}, { "test.source.$" : 1}).pretty() 

Вы могли бы извлечь член, делая это:

var member = db.coll.find(
       { "test.source.member" : "xyz"}, 
       { "test.source.$" : 1} 
       ).test.source[0].member; 

Значение элемента будет:

xyz 
+0

То же, что и раньше. не отображает правильно отфильтрованный элемент. – user2766839

+2

@ user2766839, когда вы запускаете db.version(), что он выводит в оболочке mongo? – inspired

+1

@inspired, не должно быть {"test.source. $": 1} вместо {"test.source. $. Member": 1}, чтобы получить только первый элемент из исходного массива, который имеет член «хуг»? Если нет, можете ли вы объяснить, почему? Благодарю. –

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