3

我们在 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。有没有人有什么建议?

4

2 回答 2

1

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

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

于 2013-03-12T20:25:09.980 回答
1

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

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

您也可以尝试排序,Channels.0.Address但假设您的数组保持在某个看起来相当脆弱的顺序。

于 2013-03-12T20:31:05.527 回答