【问题标题】:How to retrieve all documents with the $match query in MongoDB Atlas如何在 MongoDB Atlas 中使用 $match 查询检索所有文档
【发布时间】:2021-03-04 15:50:45
【问题描述】:

我通过 HTML 表单从用户那里获取值 a、b 并将其传递给以下查询。我的要求是根据 a & b 值检索文档,如果它们为空,我需要检索所有文档。有人可以帮我查询吗?我应该通过什么而不是 search_data["a"] & search_data["b"] 来获取所有文档?

query = user_collection.aggregate([

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

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

            }
        }

    ])

【问题讨论】:

  • 你能分享一个文档示例和预期输出吗?
  • 你应该改为传递{$exists:true}
  • { "_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", "score" : 80, "views" : 100 } { "_id" : ObjectId("512bc962e835e68f199c8687" ), "author" : "dave", "score" : 85, "views" : 521 } =================== 在上面的示例数据中,用户将提供作者和分数 - 如果缺少两个值中的任何一个,查询应返回所有文档。

标签: mongodb mongodb-query pymongo pymongo-3.x


【解决方案1】:

如果你只是做一个匹配和项目,你不需要聚合查询,你可以使用更简单的find()操作。

下面的代码将获取您的 search_data dict 并使用 dict 理解,创建一个 search_filter,它只过滤具有某些数据的键(例如)删除空值(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'}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 2013-01-25
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多