Запросить массив в PyMongo

Я пытаюсь запросить массив с помощью PyMongo, и я получаю все значения вместо одного, соответствующего 'А А'

Формат массива:

"tags": [
        {
            "tag": {
                "name": "A A"
                    }
         }
         ]

Код Python:

import pymongo
from pprint import pprint


myclient = pymongo.MongoClient("mongodb://00.00.00.0:27017")
mydb = myclient["dbName"]
mycol = mydb["thePage"]


for x in mycol.find({},{"_id": 0, "tags.tag.name":   "A A"}):
   pprint(x)

Результат:

[{'tag': {'name': 'A A'}}, 
{'tag': {'name': 'B B'}},
{'tag': {'name': 'C C'}}]

Ожидаемый результат:

{'name': 'A A'}

Я получаю нужный мне результат с помощью MongoDB:

db.dbName.where("tags.tag.name").eq("A A")

Вам нужен фильтр запросов. mycol.find({"tags.tag.name": "A A"})

styvane 17.09.2018 07:03

@styvane Это не работает. Он возвращает все результаты не только имя, но и другие переменные.

user10354541 17.09.2018 07:14

Используйте здесь проекцию $elemMatch ... db.collection.find({ "tags.tag.name": "A A" }, { "tags": { $elemMatch: { "tag.name": "A A" } } })

Ashh 17.09.2018 09:23

@AnthonyWinzlet Я получаю invalid syntax рядом с $elemMatch. Мой код: myQuery = { "tags.tag.name": "A A" }, { "tags": { $elemMatch: { "tag.name": "A A" } } }for x in mycol.find({}, myQuery):pprint(x)

user10354541 17.09.2018 09:40

Сделал то же самое? mongoplayground.net/p/tqBuuNZVBNF

Ashh 17.09.2018 09:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
5
250
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала вам нужно разобрать массив. Попробуйте сделать это:

mycol.aggregate([
    {'$unwind':'$tags'},
    {'$match': {
        'tags.tag.name':'A A',
    }},
    {'$project': {
        'tags.tag.name': 1, '_id': 0
    }},
])

Куда это идет в моем коде? Извините, я новичок в Python и MongoDb

user10354541 17.09.2018 09:56

@newbierp просто замените вашу строку mycol.find на это.

Saket Khandelwal 17.09.2018 09:57

Я получаю сообщение об ошибке self._error_message(selector)) pymongo.errors.ServerSelectionTimeoutError: 00.00.00.0:27017: timed out

user10354541 17.09.2018 10:02

У вас проблема с сервисом mongo. Вы запускаете службу mongo с терминала?

Saket Khandelwal 17.09.2018 10:04

Извини, это было моей проблемой. Я исправил это. Но теперь у меня новая ошибка: pymongo.errors.OperationFailure: path option to $unwind stage should be prefixed with a '$': tags

user10354541 17.09.2018 10:05

Попробуй еще раз скопировать мой код. я действительно редактировал это несколько минут назад. у вас может не быть нового. Или вы можете просто добавить знак $ перед тегами. {'$unwind':'$tags'}.

Saket Khandelwal 17.09.2018 10:07

Неважно, это я тоже исправил. Но теперь этот запрос возвращает черный {}

user10354541 17.09.2018 10:09

Спасибо, вот что я сделал. Это не дает мне никаких ошибок, но и не дает мне результата. Это просто дает {}

user10354541 17.09.2018 10:11

Это было у меня плохо. У меня было лишнее пространство между A A

user10354541 17.09.2018 14:35

Извините, что опоздали. У меня был быстрый вопрос: я пытаюсь использовать оператор LIKE для '$match': {'tags.tag.name':'A A',}. Я пытался сделать '$match': {'tags.tag.name':'/A A/',}, но получаю сообщение об ошибке. Что я делаю неправильно?

user10354541 20.09.2018 07:51

На самом деле это не ошибка, ничего не возвращает

user10354541 20.09.2018 08:06

Разве {'tags.tag.name':'A A',} не является точным соответствием tags.tag.name ='A A' в SQL. Я пытался сделать Pymongo, эквивалентный tags.tag.name LIKE '%A A%'

user10354541 20.09.2018 13:54

Не могли бы вы помочь с этим: stackoverflow.com/questions/52829141/…

user10354541 16.10.2018 16:59

Другие вопросы по теме