如何从mongo游标查询返回observable.fromEvent?

时间:2018-01-16 18:38:21

标签: node.js mongodb rxjs reactivex

我有一个执行查询的函数,并从查询返回的游标事件中返回一个observable:

exports.query_tokens = (db) => {
  var req = db.collection('collectionName').find({});
  return Rx.Observable.fromEvent(req, 'data');
}

我正在使用它:

...
do(mongo_functions.query_tokens).
subscribe(console.log);

但是我在控制台中得到了这个:

Db {
nodejs                    |   domain: null,
nodejs                    |   _events: {},
nodejs                    |   _eventsCount: 0,
nodejs                    |   _maxListeners: undefined,
nodejs                    |   s: 
nodejs                    |    { databaseName: 'myDatabase',
nodejs                    |      dbCache: {},
nodejs                    |      children: [],
nodejs                    |      topology: 
nodejs                    |       Server {
nodejs                    |         domain:
...

如您所见,它们不是我的文件。我做错了什么?

正如您所看到的,Curso实际上会触发一个名为data http://mongodb.github.io/node-mongodb-native/3.0/api/Cursor.html#event:data

的事件

2 个答案:

答案 0 :(得分:0)

do运算符会收到可观察的nexterrorcomplete通知,但对可观察量没有影响。也就是说,忽略do运算符next函数返回的任何值。因此,传递给subscribe的函数会收到Db

而不是do,您很可能希望使用switchMap将可观察事件展平为可观察流:

...
.switchMap(mongo_functions.query_tokens)
.subscribe(console.log);

答案 1 :(得分:0)

我发现使用以下代码更方便

export function findObs(collection: Collection<any>, queryConditions?: any) {
    const queryObj = queryConditions ? queryConditions : {};
    const queryCursor = collection.find(queryObj);
    return Observable.create((observer: Observer<Array<ObjectID>>): TeardownLogic => {
                            queryCursor.forEach(
                                doc => observer.next(doc),
                                () => observer.complete()
                            )
                        })
}

原因是方法Observable.from忽略了光标的&#34;完成&#34; 事件,因此您永远无法输入&#34;订阅者的onComplete&#34; 功能。

另一方面,使用方法Observable.create可以控制光标的完成,因此也会触发订阅者的&#34; onComplete&#34; 功能。< / p>