Pymongo: агрегировать все документы, которые не имеют одно поле, а имеют другое - группировать по - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь получить набор документов из моей коллекции со следующими условиями:

  • поле: img_status не существует
  • поле: изображения должны существовать

Затем сгруппируйте эти документы (уникальные / разные) по одному полю. Когда я выполняю запрос в MongoDB, кажется, что он возвращает правильные значения:

db.getCollection('products').aggregate([
{ $match: { images: { $exists: true, $ne: null } } },
{ $match: { img_status: { $exists: false } } },
{ $group : { _id:"$vendor_link", "uuid" : {$first: "$uuid"}, "images": { $first: "$images"} } }
])

Но в PyMongo я всегда получаю противоположное, например: img_status exist = true:

pipeline = [
    {
        "$match": 
        {   
            "images" : 
            { "$ne" : "null", "$exists": "true", } 
        }
    },
    {
        "$match": 
        {   
            "img_status": 
            {"$exists": "false"}
        }
    },
    {
        "$group":
        {
            "_id"       : "$vendor_link",
            "images"    : {"$first": "$images"},
            "uuid"      : {"$first": "$uuid"},
            "source"    : {"$first": "$source"}
        }},
]
pprint(list(self.collection.aggregate(pipeline)))

Что я делаю не так?

1 Ответ

1 голос
/ 11 ноября 2019

Это должно решить проблему. Вы передаете строковые значения вместо None и логические значения True и False

pipeline = [
    {
        "$match": {   
            "images" : {
                "$ne" : None,
                "$exists": True,
            } 
        }
    },
    {
        "$match": {
            "img_status": {
                "$exists": False,
            }
        }
    },
    {
        "$group":{
            "_id"       : "$vendor_link",
            "images"    : {"$first": "$images"},
            "uuid"      : {"$first": "$uuid"},
            "source"    : {"$first": "$source"}
        }
    },
]
pprint(list(self.collection.aggregate(pipeline)))
...