mongodb检索按固定顺序排序的documnets

时间:2015-05-20 09:03:05

标签: mongodb sorting

我想实现一个要求,即"首先检索具有特定条件的某些记录,然后记录其他条件,然后记录其他条件......"

我们假设有一个包含这些文件的集合:

{
   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
}

我想知道是否有优雅的方式:

  • 我希望首先检索带有cityId 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
}

只需一个查询就能做到吗?我认为应该有一个排序条件,但是如何编写那种排序条件?

1 个答案:

答案 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})

enter image description here

了解详情:http://blog.mongolab.com/2012/06/cardinal-ins/