首页 > 解决方案 > 从自定义查询对象中过滤 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"}

标签: mongodbfilter

解决方案


使用构面的聚合查询可以获取两种不同条件的文档:

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 }

推荐阅读