如何在 MongoDB Atlas 中使用 $match 查询检索所有文档
How to retrieve all documents with the $match query in MongoDB Atlas
我通过 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'],
}
}
])
如果只是做match和project,不需要聚合查询,可以使用更简单的find()
操作。
下面的代码将获取您的 search_data
字典并使用字典理解,创建一个 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'}
我通过 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'],
}
}
])
如果只是做match和project,不需要聚合查询,可以使用更简单的find()
操作。
下面的代码将获取您的 search_data
字典并使用字典理解,创建一个 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'}