首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用元素匹配和过滤器执行pymongo查询。

使用元素匹配和过滤器执行pymongo查询。
EN

Stack Overflow用户
提问于 2020-04-02 10:59:00
回答 1查看 146关注 0票数 0

我有以下数据结构:

代码语言:javascript
复制
[
    {
        "site_id": ObjectId("5e85b9d20498abd407e9a030"),
        "status": "ERROR"
    },
    {
        "site_id": ObjectId("5e85b9d20498abd407e9a120"),
        "status": "ERROR"
    },
    {
        "site_id": ObjectId("5e85b9d20498abd407e9a030"),
        "status": "OK",
        "risk_categories": [
            {

                "position": 1,
                "category_id": 1414,
            },
            {

                "position": 2,
                "category_id": 1402,

            },
            {

                "position": 3,
                "category_id": 1392,

            }
                ]
    }
]

我想对pymongo进行如下查询:

collection.find_one(filter=filter)

其中: filter ={‘$’和‘:[{'$and':{'site_id':ObjectId('5e85b9d20498abd407e9a030')},{“状态”:’OK‘},{’危险_类别‘:{'$elemMatch':{’$或‘:{’$‘{’eq‘:1}},{’位置‘:{'$eq':2}

但是,它会返回整个对象。不仅仅是我想要的风险类别的价值。我能在我的过滤器上做些什么来修改它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-02 11:42:51

聚合从mongo shell运行:

代码语言:javascript
复制
db.collection.aggregate( [
  { 
      $match:  { 
          site_id: ObjectId('5e85b9d20498abd407e9a030'), 
          status: "OK" 
      } 
  },
  { 
      $addFields: {
          risk_categories: { 
              $filter: { 
                  input: "$risk_categories", 
                  as: "cat",
                  cond: {
                      $in: [ "$$cat.position", [ 1, 2 ] ]    // this is equivalent to using the "$or"
                  }
              }
          }
      }
  },
] ).pretty()

产出:

代码语言:javascript
复制
{
        "_id" : ObjectId("5e85c7b6724e461876467077"),
        "site_id" : ObjectId("5e85b9d20498abd407e9a030"),
        "status" : "OK",
        "risk_categories" : [
                {
                        "position" : 1,
                        "category_id" : 1414
                },
                {
                        "position" : 2,
                        "category_id" : 1402
                }
        ]
}

使用Python中的PyMongo 3.9和MongoDB 4.2:

代码语言:javascript
复制
import pymongo
from pymongo import MongoClient
client = MongoClient()
db = client.test
collection = db.collection
import pprint
from bson.objectid import ObjectId

pipeline = [
  { 
      '$match':  { 
          'site_id': ObjectId('5e85b9d20498abd407e9a030'), 
          'status': 'OK'
      } 
  },
  { 
      '$addFields': {
          'risk_categories': { 
              '$filter': { 
                  'input': '$risk_categories', 
                  'as': 'cat',
                  'cond': {
                      '$in': [ '$$cat.position', [ 1, 2 ] ]
                  }
              }
          }
      }
  },
]

pprint.pprint(list(collection.aggregate(pipeline)))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60989990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档