MongoDB Return 过滤器中的指定文档
MongoDB Return specified document in Filters
我有这个文件
它包含名为 reviews
的文档数组
我尝试使用此代码获取 Théo 发布的评论,但它一直返回给我整个文档(包括评论中的子文档),而不是我使用过滤器指定的文档。
Document document = collection.find(Filters.and(Filters.eq("reviews.reviewer_name", "Théo"))).first();
我真的不明白如何只得到这个特定的文件。感谢您的帮助
如果您尝试进行子文档查询并且只检索特定的子文档,则无法使用 mongo 的简单查询来实现。但是,您可以使用聚合管道来实现这一点。
db.collection.aggregate([
// This is the same as your initial find query, it will limit the top-level docs to only be the ones you are interested in
{ $match: { 'reviewers.reviewer_name': 'Theo' } },
// You can now unwind the results, which will make all the sub-documents top-level
{ $unwind: '$reviewers' },
// Re-match to filter the reviewers, this will actually drop the unmatched reviewers
{ $match: { 'reviewers.reviewer_name': 'Theo' } },
// Now you can use a projection to get the final results you are looking for
{ $project: { reviewer: '$reviewers' } }
])
这将 return 具有 reviewer
属性 的对象数组,每个元素包含一条评论。然后,您可以使用分页阶段 trim 结果:
db.collection.aggregate([
// ... same stages as above, and then:
{ $limit: 1 },
])
不确定您正在使用的 Java 驱动程序的具体数据结构是什么,但这些是可以解决问题的一般 mongo 查询。
如果您想阅读有关聚合管道的更多信息,我建议您查看 official documentation,它太棒了,我打开了一整天。他们应该有一些 Java 例子。
祝你好运!
我有这个文件
我尝试使用此代码获取 Théo 发布的评论,但它一直返回给我整个文档(包括评论中的子文档),而不是我使用过滤器指定的文档。
Document document = collection.find(Filters.and(Filters.eq("reviews.reviewer_name", "Théo"))).first();
我真的不明白如何只得到这个特定的文件。感谢您的帮助
如果您尝试进行子文档查询并且只检索特定的子文档,则无法使用 mongo 的简单查询来实现。但是,您可以使用聚合管道来实现这一点。
db.collection.aggregate([
// This is the same as your initial find query, it will limit the top-level docs to only be the ones you are interested in
{ $match: { 'reviewers.reviewer_name': 'Theo' } },
// You can now unwind the results, which will make all the sub-documents top-level
{ $unwind: '$reviewers' },
// Re-match to filter the reviewers, this will actually drop the unmatched reviewers
{ $match: { 'reviewers.reviewer_name': 'Theo' } },
// Now you can use a projection to get the final results you are looking for
{ $project: { reviewer: '$reviewers' } }
])
这将 return 具有 reviewer
属性 的对象数组,每个元素包含一条评论。然后,您可以使用分页阶段 trim 结果:
db.collection.aggregate([
// ... same stages as above, and then:
{ $limit: 1 },
])
不确定您正在使用的 Java 驱动程序的具体数据结构是什么,但这些是可以解决问题的一般 mongo 查询。
如果您想阅读有关聚合管道的更多信息,我建议您查看 official documentation,它太棒了,我打开了一整天。他们应该有一些 Java 例子。
祝你好运!