我想实现一个要求,即"首先检索具有特定条件的某些记录,然后记录其他条件,然后记录其他条件......"
我们假设有一个包含这些文件的集合:
{
name:"tour in beijing for one night",
fee: 500,
cityId: 5010
},
{
name:"vistit in shanghai for one night with food",
fee: 700,
cityId: 4011
},
{
name:"tour in beijing for tow days",
fee: 900,
cityId: 5010
},
{
name:"vistit in shanghai for one night",
fee: 450,
cityId: 4011
},
{
name:"visit kuangchou for one day",
fee: 400,
cityId: 3013
},
{
name:"tour in beijing with food",
fee: 1000,
cityId: 5010
}
我想知道是否有优雅的方式:
5010
的记录,其类型为fee
ASC。然后是cityId 4011
(也有fee
ASC的那种类型)(但如果不能同时进行ASC排序,那么它是可以接受的,但大部分记录按顺序排序不同的cityId非常想要。)对于这个特定的示例数据,我希望查询结果按此顺序排列(如果我将cityId命令[5010,4011,3013]
作为排序条件)请注意,cityId可能位于其他中混合顺序,这个例子的降序只是一个愉快的重合:
// beijing with cityId 5010 will be retrieved first with fee ASC
{
name:"tour in beijing for one night",
fee: 500,
cityId: 5010
},
{
name:"tour in beijing for tow days",
fee: 900,
cityId: 5010
},
{
name:"tour in beijing with food",
fee: 1000,
cityId: 5010
},
// then comes shanghai with cityId of 4011
{
name:"vistit in shanghai for one night",
fee: 450,
cityId: 4011
},
{
name:"vistit in shanghai for one night with food",
fee: 700,
cityId: 4011
},
// then kuangzhou
{
name:"visit kuangchou for one day",
fee: 400,
cityId: 3013
}
只需一个查询就能做到吗?我认为应该有一个排序条件,但是如何编写那种排序条件?
答案 0 :(得分:0)
使用聚合管道运算符。文档按顺序通过各个阶段。所以你可以在cityID上进行$匹配,然后在每个组上进行$ sort。
db.collection.aggregate({
$match: { cityId: { $in: [5010, 4011] } }
}, {
$sort: { fee: -1 }
})
在黑暗中编码所以我无法测试。也可能需要分组。
db.collection.aggregate( {$match: ...}, {$group: ...}, {$sort: ...} )
这肯定会朝着正确的方向发展。
上一个答案:
使用$ in
db.collection.find({"cityId": {"$in": ["5010", "4011"]}}).sort({"fee": 1})