有没有办法按嵌套集合对Mongo结果进行排序?

时间:2013-03-12 20:18:04

标签: mongodb mongodb-.net-driver

我们在Mongo设置中存储了数百万条订阅者记录。我的任务是在记录上放一个前端,让它们被搜索。我的搜索查询看起来很棒,但我需要能够对它们进行排序并使它们可分页。我们的Mongo设计就是将通道信息嵌套在一个数组中。我试图对“Channels.Address”进行排序,因为电子邮件是我们唯一拥有地址的频道,但它并不是那样的。它会以相同的顺序返回我的结果,无论是否有升序或降序。

我们的收藏品类似于:

订户:

{
  "_id" : "",
  "FirstName" : "Tester",
  "LastName" : "Tester",
  "Channels" : [{
      "_t" : "EmailChannel",
      "IsEnabled" : true,
      "Type" : 1,
      "Address" : "test@test.com"
    }, {
      "_t" : "SmsChannel",
      "IsEnabled" : true,
      "Type" : 2,
      "Number" : "88888888"
    }, {
      "_t" : "FaxChannel",
      "IsEnabled" : false,
      "Type" : 4,
      "Number" : null
    }]
}

我目前的想法是编写一个MapReduce,它返回我需要的东西并搜索它而不是这个。但这样做似乎浪费了太多的空间。这是一个使用频繁的表,所以我不能使用eval。有没有人有任何建议?

2 个答案:

答案 0 :(得分:1)

据我所知,没有办法对mongodb嵌套数组进行排序。

您可以使用C#排序在自己的代码上执行此操作,也可以尝试使用聚合框架http://docs.mongodb.org/manual/applications/aggregation/。您需要“重新创建”项目,展开频道,对其进行排序并重新组合。我想这会成功!

答案 1 :(得分:1)

添加名为sort的字段。存储您要在该字段中排序的任何键。将其编入索引并将其用作排序顺序。

在处理文档数据库时,有时需要以这种方式对数据进行反规范化。通常你会想要将密钥转换为小写字母,也可能删除某些字符,以便创建符合您的精确要求的订单(或搜索字段),当然,所有“保存”和“更新”代码需要维护这个额外的字段。

您也可以尝试对Channels.0.Address进行排序,但这会假设您的数组保持某种看似相当脆弱的顺序。