以下是代码:
const oids = [1, 2, 3, 4, 5, 6, 7];
// func to get mongodb cursor
const getCursor = oid => mdb.content.collection.find({
status: {
$in: [1, 2]
},
oid
}, {
_id: -1,
oid: 1,
description: 1,
});
// scan func to accumulate text
const accumulateText = (acc = '', post) => acc += ' ' + post.description;
// generating innerObservables
const getInnerObservable$ = oid => {
// first, set the MongoDB cursor
const cursor = getCursor(oid);
return Rx.Observable
// create an observable from cursor's data event
.fromEvent(cursor, 'data')
// and read until there's no more data
.takeUntil(
Rx.Observable.fromEvent(cursor, 'end')
)
// accumulate text from every document that fits the condition
.reduce(accumulateText)
// AFTER EVERY DOCUMENT HAD BEEN THROUGH THE SCAN
// map the accumulated text through a word frequency count function
.map(str => helpers.countWordFrequency(str))
.catch(err => console.error(err));
};
const content$ = Rx.Observable
.from(oids)
// for each oid, get an inner observable
.mergeMap(getInnerObservable$);
return new Promise((res, rej) => content$.subscribe({
next: (v) => console.log(v),
complete: () => res()
}))
.then(() => console.log('Done'));

基本上,我知道我的方法是错误的,但我对如何以正确的方式实施它完全感到困惑。我在代码中添加了一些注释,以帮助理解我的目标。
我正在使用RxJS5和Node 7.1.0。
感谢任何帮助和/或反馈。
编辑:我发现有一个reduce
方法(编辑代码),这似乎可以完成这项工作,但最终文档开始因某些原因完全绕过它。我不知道为什么会这样。似乎在我身上存在一些根本性的误解。
EDIT2:基本上,由于某种原因,某些数据只是跳过getInnerObservable$
返回的观察者上的reduce方法,并以某种方式直接跳到map
方法。我仍然不知道为什么,但除此之外,它按预期工作。有任何想法吗?老实说,我完全失败了。