如何合并不同集合的游标并按日期排序

时间:2015-04-08 21:18:38

标签: javascript node.js mongodb collections meteor

是否可以合并两个或更多不同的collections并按createdAt?

对它们进行排序

e.g。我有一些数据,如

    CollectionA.insert({
        createdAt: new Date(),
        field1: value1,
        field2: value3,
        field3: value2,
    });
    CollectionB.insert({
        createdAt: new Date(),
        field4: value4,
        field5: value5,
        field6: value6,
        field7: value7,
    });

我想在服务器上合并和订购它们,客户端稍后通过订阅获得合并的CollectionC。 如何合并和订购馆藏?我想尽可能便宜地做到这一点

2 个答案:

答案 0 :(得分:2)

无法同时查询两个集合。所以你有两个解决方案:

  • 非常糟糕的一个:从collectionA选择一个查询中的所有内容,从collectionB选择所有内容,在应用层上对所有内容进行排序并获得结果。很容易看出,一旦你有任何合理的尺寸,这将变得不可扩展。你可以做一些工作(比如仅选择仅接近createdAt的元素),但它仍然很糟糕。
  • 我会做什么。如果集合中的数据类似,为什么还需要这两个集合。重构您的数据库并将它们合并在一起(如果由于某种原因您需要知道它们来自哪个集合,请添加字段type: 1|2。这样您就可以对数据库层(不是应用程序层)进行排序。

我如何合并它们。我会在mongoshell中执行此操作:

db.collectionA.find().forEach(function(doc){
   db.collectionB.insert(doc);
});
db.collectionA.drop()

在此之后,您将最终只使用collectionB,它将包含两个集合中的文档。

答案 1 :(得分:1)

总而言之:您必须在应用程序方面执行此操作,因为游标与集合相关联。因此,您必须手动合并结果集。

合并后,您可以使用以下方法对它们进行排序

function sortByField(a,b){
  if(a.fieldName < b.fieldName) {
    return -1;
  }
  else if(a.fieldName == b.fieldName){
     return 0;
  }
  else return 1;
}

var sortedArray = mergedArray.sort(sortByField)