mongodb $exists всегда возвращает 0

У меня есть коллекция базы данных (с именем fols), например:

{'followers':
        {
           '123':1
           '123':2
           '123':3
         }
}

Если я запускаю запрос (используя pymongo):

cursor = fols.find()
cursor.count()
>>3

Работает отлично. В настоящее время:

cursor = fols.find({'followers':{'123':1}})
cursor.count()
>>1

Опять работает нормально. НО, если я попытаюсь:

cursor = fols.find({'followers':{'123':{'$exists': True}}})
cursor.count()
>> 0

Он возвращает 0, хотя записей 3.


person Amitash    schedule 13.09.2012    source источник
comment
Не могли бы вы уточнить: у вас есть коллекция followers с тремя документами: {'123': 1}, {'123': 2}, {'123': 3}, или у вас есть коллекция fols, содержащая один документ с 3 поддокумента: {'подписчики': {'123': 1}, {'123': 2}, {'123': 3}} ? Потому что ключ «123» будет перезаписан, и останется только одна копия.   -  person Thomas    schedule 13.09.2012
comment
У меня есть коллекция фоллов, содержащая один документ-последователи, который содержит другие значения. И я могу подтвердить, что он не перезаписывается, как если бы я это делал: fols.find(). Он возвращает все мои 3 документа.   -  person Amitash    schedule 13.09.2012
comment
Если у вас есть один документ в коллекции fols, то fols.find() должен возвращать только один документ, а не 3. Я пробовал это в оболочке mongo: db.fols.insert({'followers': {'123' :1, '123':2, '123':3}}) и с помощью db.fols.find() вернуть { _id : ObjectId(505149486195484752df6214), Followers: { 123 : 3 } }.   -  person Thomas    schedule 13.09.2012
comment
Иметь массив с тройным ключом say 123 — это *ерунда. Это свернется в массив, в котором одна пара ключ-значение скрывает две другие.   -  person Andreas Jung    schedule 13.09.2012


Ответы (2)


Если вы не сопоставляете полный объект, вам нужно использовать точечную нотацию для использования оператора против встроенного объекта. Итак, в этом случае:

cursor = fols.find({'followers.123':{'$exists': True}})
person JohnnyHK    schedule 13.09.2012

Попробуйте точечный синтаксис:

cursor = fols.find({'followers.123': {'$exists': True}})

Но также см. мой комментарий выше. Вы не можете иметь один и тот же ключ более одного раза в (под)документе.

person Thomas    schedule 13.09.2012