如何合并不同集合的游标并按日期排序
how to merge cursors of different collections and order them by date
是否可以合并两个或多个不同的collections
并通过createdAt对其进行排序?
例如,我有一些像这样的数据
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。如何合并和排序集合?我想尽可能便宜地这样做
无法同时查询这两个集合。所以你有两个解决方案:
- 非常糟糕的一个:用一个查询从
collectionA
中选择所有内容,用另一个查询选择collectionB
中的所有内容,在应用层上对所有内容进行排序,然后得到结果。很容易看出,一旦你有了任何合理的尺寸,这就变得不可缩放了。您可以进行变通(比如只选择靠近createdAt
的元素),但这仍然很糟糕 - 如果集合中的数据如此相似,为什么需要两个集合。重构数据库并将它们合并在一起(如果出于某种原因,您需要知道它们来自哪些集合,请添加字段
type: 1|2
。这样,您将在数据库层(而不是应用程序层)上进行排序
我该如何将它们合并。我会在mongoshell用做这件事
db.collectionA.find().forEach(function(doc){
db.collectionB.insert(doc);
});
db.collectionA.drop()
在这之后,你将只得到collectionB,它将拥有来自两个集合的文档。
长话短说:您必须在应用程序端执行此操作,因为游标与集合绑定。因此,您必须手动合并结果集。
合并后,可以使用以下方法对它们进行排序
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)
相关文章:
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 使用promise和mongoose对文档进行排序
- Selectize.js:如何对整数值的选项进行排序
- Javascript排序的图像弹出窗口..可以't单独弹出
- 如何通过引用var Using DataTables来进行分页或排序
- 为什么HTML5拖放的目标是孩子?(可排序列表)
- AngularJs对所有页面中的所有记录进行排序
- 当属性不一致时,如何根据属性对JS对象列表进行排序
- 按从高到低对多个int变量进行排序
- jQuery UI可排序-多连接列表拖动
- Javascript排序字符串或数字
- 2个backbone.js集合,具有相同的模型,但排序顺序不同
- sort而不是排序javascript
- CSS中的游标属性似乎不适用于USB On The Go
- 通过从节点父级获取所有子级对节点进行排序(获取子级数组)
- 如何合并不同集合的游标并按日期排序
- 为什么我的JavaScript堆栈排序函数不起作用
- ui网格:在自定义表头模板中触发排序
- jquery Onclick函数带有导致双击的回调排序函数
- 如何按日期对迷你游标进行排序