Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: AmitashОтветов: 2

У меня есть коллекция базы данных (с именем 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.

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

mongodbpymongo

Ответы

Ответ 1 · рейтинг 27 · JohnnyHK

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

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

Ответ 2 · рейтинг 5 · Thomas

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы