我们在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。有没有人有任何建议?
答案 0 :(得分:1)
据我所知,没有办法对mongodb嵌套数组进行排序。
您可以使用C#排序在自己的代码上执行此操作,也可以尝试使用聚合框架http://docs.mongodb.org/manual/applications/aggregation/。您需要“重新创建”项目,展开频道,对其进行排序并重新组合。我想这会成功!
答案 1 :(得分:1)
添加名为sort
的字段。存储您要在该字段中排序的任何键。将其编入索引并将其用作排序顺序。
在处理文档数据库时,有时需要以这种方式对数据进行反规范化。通常你会想要将密钥转换为小写字母,也可能删除某些字符,以便创建符合您的精确要求的订单(或搜索字段),当然,所有“保存”和“更新”代码需要维护这个额外的字段。
您也可以尝试对Channels.0.Address
进行排序,但这会假设您的数组保持某种看似相当脆弱的顺序。