如何在 MongoDB Atlas 中使用 $match 查询检索所有文档
Posted
技术标签:
【中文标题】如何在 MongoDB Atlas 中使用 $match 查询检索所有文档【英文标题】:How to retrieve all documents with the $match query in MongoDB Atlas 【发布时间】: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 =================== 在上面的示例数据中,用户将提供作者和分数 - 如果缺少两个值中的任何一个,查询应返回所有文档。
【参考方案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'
【讨论】:
以上是关于如何在 MongoDB Atlas 中使用 $match 查询检索所有文档的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PHP 正确检查 MongoDB Atlas 数据库中的现有数据。我总是知道名字已经存在
如何将 MongoDB 领域应用程序用户添加到 Atlas 集合?
使用区块链技术的身份管理应用,MongoDB Stitch & MongoDB Atlas