mongodb - 从自定义查询对象中过滤 mongodb 作为输入
问题描述
我正在尝试按输入列表中的 id 和版本过滤我的搜索结果。如果未提供版本,则获取该 ID 的最新版本。当我同时拥有 id 和版本时,以下查询有效。但是,对于 id:2,我只需要返回最新的。
db.mycollection.find({
$or: [
{
id: 1,
version: 1
},
{
id : 1,
version: 2
},
{
id : 2,
version: {$max: "$version"} // get the latest version if not provided
}
]})
我收到以下错误
{
"message" : "unknown operator: $max",
"ok" : 0,
"code" : 2,
"codeName" : "BadValue",
"name" : "MongoError"}
解决方案
使用构面的聚合查询可以获取两种不同条件的文档:
db.myCollection.aggregate( [
{ $facet: {
with_version: [
{ $match: { $or: [ { id: 1, version: 1 }, { id: 3, version: 2 } ] } },
],
without_version: [
{ $match: { id: 2 } },
{ $sort: { version: -1 } },
{ $limit: 1 },
],
} },
{ $project: { docs: { $concatArrays: [ "$with_version", "$without_version" ] } } },
{ $unwind: "$docs" },
{ $project: { _id: "$docs._id", id: "$docs.id", version: "$docs.version" } },
] )
使用以下文档作为输入:
{ "_id" : "a", "id" : 1, "version" : 1 }
{ "_id" : "b", "id" : 2, "version" : 1 }
{ "_id" : "c", "id" : 3, "version" : 2 }
{ "_id" : "d", "id" : 2, "version" : 2 }
{ "_id" : "e", "id" : 4, "version" : 2 }
{ "_id" : "f", "id" : 3, "version" : 1 }
{ "_id" : "g", "id" : 3, "version" : 0 }
{ "_id" : "h", "id" : 2, "version" : 0 }
结果显示 , 的匹配文档{ id: 1, version: 1 }
和{ id: 3, version: 2 }
的最大版本号id: 2
。
{ "_id" : "a", "id" : 1, "version" : 1 }
{ "_id" : "c", "id" : 3, "version" : 2 }
{ "_id" : "d", "id" : 2, "version" : 2 }
推荐阅读
- c# - 如何在 C# 中将字符串转换为 int
- c# - 如何使用 ExpressMapper 映射递归嵌套对象
- spring-boot - spring-security-oauth2-autoconfigure 用法
- java - ANTLR 通配符运算符不消耗预期的输入
- string - 如何使用`reads`将字符串转换为元组?
- android - 如何在 Android Studio 布局预览中选择我的主题
- dart - 从 Flutter 应用程序向 localhost 发出请求时使用随机端口获取错误消息
- awk - 从多个文件中获取最后 2 行
- c# - 更改 ReportViewer 的 RDLC 报告 - 未为数据源错误提供数据源实例(WFA C#)
- ruby - 在 Lambda 代码中指定触发事件的文件