Более низкие значения внутри $ in для PyMongo - PullRequest
0 голосов
/ 16 октября 2019

Я хочу «понизить» значения совпадения внутри «$ in». Есть ли способ сделать это?

Мой код:


    results = list(
        col.aggregate([
            {
                '$match': { 'website': { '$in': filters['website'].split('|') }, 'val': { '$ne': None },
            'val': { '$ne': 'none' }}
            }, {
                '$group': {
                    '_id': {
                        'val': $val
                    }
                }
            }, {
                '$project': {
                    '_id': 0,
                    'val': '$_id.val'
                }
            }, {
                '$sort': {
                    'val': 1
                }
            }
        ])
    )

    return dumps(results, indent=4)

Фильтры ['website'] могут быть множественными и выбираться на передней панели. Я хочу, чтобы матч был в НИЖНЕМ. Значения внутри коллекции теперь выглядят так:

  • Google
  • FaceBook
  • Twitter

Но я хочу опустить и сопоставитьэти значения. Есть ли способ сделать это?

1 Ответ

0 голосов
/ 16 октября 2019

Я предлагаю вам использовать $regex с учетом регистра без учета регистра. Это не соответствует «ниже», но я подозреваю, что это то, что вы ищете. Также я реорганизовал ваш код для использования $nin, что немного лучше.

from pymongo import MongoClient
import json
import re

db = MongoClient()['mydatabase']

filters = {'website': 'Google|FaceBook|Twitter'}
db.col.insert_one({'website': 'GOOGLE', 'val': 1})
db.col.insert_one({'website': 'Google', 'val': 2})
db.col.insert_one({'website': 'google', 'val': 3})
db.col.insert_one({'website': 'GoOgLe', 'val': 4})
db.col.insert_one({'website': 'FaceBook', 'val': 5})
db.col.insert_one({'website': 'FaceBook', 'val': None})
db.col.insert_one({'website': 'Twitter', 'val': 6})
db.col.insert_one({'website': 'TWITTER', 'val': 7})
db.col.insert_one({'website': 'TWITTER', 'val': 'none'})
db.col.insert_one({'website': 'Instagram', 'val': 8})

results = list(
    db.col.aggregate([
        {
            '$match': {'website': re.compile(filters['website'], re.IGNORECASE), 'val': {'$nin': [ None, 'none' ] }}
        }, {
            '$group': {
                '_id': {
                    'val': '$val'
                }
            }
        }, {
            '$project': {
                '_id': 0,
                'val': '$_id.val'
            }
        }, {
            '$sort': {
                'val': 1
            }
        }
    ])
)

print (json.dumps(results, indent=4))
...