从自定义查询对象中筛选mongodb作为输入
我正在尝试从输入列表中按id和版本筛选搜索结果。如果未提供版本,则获取该ID的最新版本。当我同时拥有ID和版本时,下面的查询将起作用。但是,对于id:2,我只需要返回最新的id从自定义查询对象中筛选mongodb作为输入,mongodb,filter,Mongodb,Filter,我正在尝试从输入列表中按id和版本筛选搜索结果。如果未提供版本,则获取该ID的最新版本。当我同时拥有ID和版本时,下面的查询将起作用。但是,对于id:2,我只需要返回最新的id db.mycollection.find({ $or: [ { id: 1, version: 1 }, { id : 1, version: 2 }, { id : 2, versio
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"}
使用facet的聚合查询可以获取两种不同条件下的文档:
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 }
尝试了下面的查询
db.mycollection.aggregate([{$match:{$or:[{id:1,版本:1},{id:1,版本:2},{id:2,版本:“$version”}},{$group:{u id:“$id”,“版本:{$max”:“$version”}}}}])
只得到了一个doc`{u id:1,“version:2}`的输出,我发布了一个答案。请告诉我结果是预期的还是其他的。谢谢发帖。我希望结果是三份文件。我将尝试下面的一个。这是否支持查询中的多个ID而无需\u版本
查询?如果未找到5和7,则返回2上的多个文档<代码>db.myCollection.aggregate([{$facet:{with_version:[{$match:{$or:[{“id”:1,“version”:1},{“id”:3,“version”:2}}}},],无_版本:[{$match:{“id”:{$in:[2,5,7]},{$sort:{$version:{$1},{$limit 3},},},},{$project:{$docs:{$concatarray:[$with_version:{$match:},},},},},{$docs:{$inc{$project:{{u id:$docs.\u id',id:$docs.id',version:$docs.version}}])这样做有效。谢谢<代码>db.myCollection.aggregate([{$facet:{with_version:[{$match:{$or:[{“id”:1,“version”:1},{“id”:3,“version”:2}]},],无{u version:[{$match:{“id”:{$in:[2,5,7]},{$sort:{$version:-1},{$group:{$id:{“uniqueId:{uniqueId:“$id:”,“doc first:{$first”:“$$CURRENT”}}}},{$replaceRoot:{“newRoot”:“$doc”}],}},{$project:{docs:{$concatarray:[“$without_version”,“$without_version”]}}},{$unwind:$docs”},{$code>