如何在MongoDB Atlas中使用$match查询检索所有文档

如何在MongoDB Atlas中使用$match查询检索所有文档,mongodb,mongodb-query,pymongo,pymongo-3.x,Mongodb,Mongodb Query,Pymongo,Pymongo 3.x,我通过一个HTML表单从用户处获取值a、b,并将其传递给下面的查询。我的要求是根据a&b值检索文档,如果它们为空,我需要检索所有doucments。有人能帮我查询一下吗?我应该传递什么来代替搜索数据[“a”]&搜索数据[“b”]来获取所有文档 query = user_collection.aggregate([ { "$project": { "_id": 0

我通过一个HTML表单从用户处获取值a、b,并将其传递给下面的查询。我的要求是根据a&b值检索文档,如果它们为空,我需要检索所有doucments。有人能帮我查询一下吗?我应该传递什么来代替搜索数据[“a”]&搜索数据[“b”]来获取所有文档

query = user_collection.aggregate([

        {
            "$project": {
                "_id": 0
            }
        },

        {
            "$match": {
                "a": search_data['a'],
                "b": search_data['b'],

            }
        }

    ])

如果只进行匹配和项目,则不需要聚合查询,可以使用更简单的
find()
操作

下面的代码将获取您的
search_数据
dict,并使用dict理解,创建一个
search_过滤器
,该过滤器只对键中有一些数据的键进行过滤(例如)删除空(
None
)和空(
'
)字段。这是一个更好的解决方案,因为您可以添加更多字段,而无需更改代码

search_filter = {k: v for (k, v) in search_data.items() if not (v is None or v == '')}
query = user_collection.find(search_filter, {'_id': 0})
完整示例:

from pymongo import MongoClient

db = MongoClient()['mydatabase']
user_collection = db.user_collection


def filtered_query(search_data):
    search_filter = {k: v for (k, v) in search_data.items() if not (v is None or v == '')}
    print(search_filter)  # Just to show what it is doing
    return user_collection.find(search_filter, {'_id': 0})

# Test it out!

filtered_query({'a': 1, 'b': ''})
filtered_query({'a': None, 'b': 3, 'c': 'x'})
filtered_query({'a': 'x123', 'b': 3, 'c': 'x', 'd': None, 'e': '', 'f': 'f'})
给出:

{'a': 1}
{'b': 3, 'c': 'x'}
{'a': 'x123', 'b': 3, 'c': 'x', 'f': 'f'}

您可以共享文档示例和预期输出吗?您应该传递
{$exists:true}
而不是{“{u id”:ObjectId(“512BC95FE835E68E68F199C8686”),“author”:“dave”,“score”:80,“views”:100}{“\u id”:ObjectId(“512bc962e835e68f199c8687”),“author”:“dave”,“score”:85,“views”:521}=======================================在上述示例数据中,用户将提供作者和分数-如果缺少这两个值中的任何一个,查询将返回所有文档。