如何在MongoDB Atlas中使用$match查询检索所有文档
我通过一个HTML表单从用户处获取值a、b,并将其传递给下面的查询。我的要求是根据a&b值检索文档,如果它们为空,我需要检索所有doucments。有人能帮我查询一下吗?我应该传递什么来代替搜索数据[“a”]&搜索数据[“b”]来获取所有文档如何在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
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}=======================================在上述示例数据中,用户将提供作者和分数-如果缺少这两个值中的任何一个,查询将返回所有文档。