【问题标题】:Query an array in PyMongo在 PyMongo 中查询一个数组
【发布时间】:2019-02-20 23:25:20
【问题描述】:

我正在尝试使用 PyMongo 查询一个数组,我得到了所有的值,而不仅仅是一个匹配 'A A'

数组格式:

"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 这不起作用。它不仅返回名称,还返回所有结果
  • 在此处使用$elemMatch 投影...db.collection.find({ "tags.tag.name": "A A" }, { "tags": { $elemMatch: { "tag.name": "A A" } } })
  • @AnthonyWinzlet 我在$elemMatch 附近得到了一个invalid syntax。我的代码:myQuery = { "tags.tag.name": "A A" }, { "tags": { $elemMatch: { "tag.name": "A A" } } }for x in mycol.find({}, myQuery):pprint(x)

标签: python html django mongodb pymongo


【解决方案1】:

你需要先解构数组。 尝试这样做:

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

【讨论】:

  • 我的代码在哪里?抱歉,我对 Python 和 MongoDb 很陌生
  • @newbierp 用这个替换你的mycol.find 行。
  • 我收到self._error_message(selector)) pymongo.errors.ServerSelectionTimeoutError: 00.00.00.0:27017: timed out 错误
  • 您的 mongo 服务有问题。你是从终端开始你的 mongo 服务吗?
  • 对不起,那是我的错。我修好了。但我现在有一个新错误:pymongo.errors.OperationFailure: path option to $unwind stage should be prefixed with a '$': tags
猜你喜欢
  • 2019-03-20
  • 2011-11-14
  • 1970-01-01
  • 2021-07-01
  • 2017-08-22
  • 1970-01-01
  • 2013-03-07
  • 2010-12-17
  • 1970-01-01
相关资源
最近更新 更多