首页 文章

Loopback如何在mongodb上读取结果聚合

提问于
浏览
1

我有一些问题要使用loopback在mongoDB上获取聚合的结果 .

这是我的Loopback配置:

  • "loopback":"^3.19.0",

  • "loopback-boot":"^2.27.1",

  • "loopback-component-explorer":"^4.0.0",

  • "loopback-component-storage":"^3.3.1",

  • "loopback-connector-mongodb":"^3.4.3",

  • "loopback-datasource-juggler":"^3.18.1",

这是我为执行聚合而编写的代码:

return new Promise((resolve, reject) => {
  Model.getDataSource().connector.connect(function(err, db) {
  if (err)
    return reject(err);

  let aggregatePipe = [
    {
      $group: {
        "_id": "$address.region",
        "count": {$sum: 1},
        "geoPoint": {$addToSet: "$geoPoint"}
      }
    }];
  let results = db.collection('Location').aggregate(aggregatePipe, (err, results) => {
    console.log(results);
    return resolve(results);
  });
});

但是,结果不包含聚合的结果,而是光标...

AggregationCursor {
  pool: null,
  server: null,
  disconnectHandler:
   Store {
     s: { storedOps: [], storeOptions: [Object], topology: [Object] },
     length: [Getter] },
  bson: BSON {},
  ns: 'acigeo-plus.Location',
  cmd:
   { aggregate: 'Location',
     pipeline: [ [Object], [Object], [Object] ],
     cursor: { batchSize: 1000 } },
  options:
   { readPreference: ReadPreference { mode: 'primary', tags: undefined, options: undefined },
     cursor: { batchSize: 1000 },
     promiseLibrary: [Function: Promise],
     cursorFactory: { [Function: AggregationCursor] super_: [Object], define: [Object], INIT: 0, OPEN: 1, CLOSED: 2 },
     disconnectHandler: Store { s: [Object], length: [Getter] },
     topology:
      Server {
        domain: null,
        _events: [Object],
        _eventsCount: 25,
        _maxListeners: Infinity,
        clientInfo: [Object],
        s: [Object] } },
  topology:
   Server {
     domain: null,
     _events:
      { serverOpening: [Function],
        serverDescriptionChanged: [Function],
        serverHeartbeatStarted: [Function],
        serverHeartbeatSucceeded: [Function],
        serverHeartbeatFailed: [Function],
        serverClosed: [Function],
        topologyOpening: [Function],
        topologyClosed: [Function],
        topologyDescriptionChanged: [Function],
        commandStarted: [Function],
        commandSucceeded: [Function],
        commandFailed: [Function],
        joined: [Function],
        left: [Function],
        ping: [Function],
        ha: [Function],
        authenticated: [Function],
        error: [Array],
        timeout: [Array],
        close: [Array],
        parseError: [Array],
        open: [Array],
        fullsetup: [Array],
        all: [Array],
        reconnect: [Array] },
     _eventsCount: 25,
     _maxListeners: Infinity,
     clientInfo:
      { driver: [Object],
        os: [Object],
        platform: 'Node.js v8.9.4, LE' },
     s:
      { coreTopology: [Object],
        sCapabilities: [Object],
        clonedOptions: [Object],
        reconnect: true,
        emitError: true,
        poolSize: 5,
        storeOptions: [Object],
        store: [Object],
        host: 'localhost',
        port: 27017,
        options: [Object],
        sessionPool: [Object],
        sessions: [],
        promiseLibrary: [Function: Promise] } },
  cursorState:
   { cursorId: null,
     cmd: { aggregate: 'Location', pipeline: [Array], cursor: [Object] },
     documents: [],
     cursorIndex: 0,
     dead: false,
     killed: false,
     init: false,
     notified: false,
     limit: 0,
     skip: 0,
     batchSize: 1000,
     currentLimit: 0,
     transforms: undefined,
     reconnect: true },
  logger: Logger { className: 'Cursor' },
  _readableState:
   ReadableState {
     objectMode: true,
     highWaterMark: 16,
     buffer: BufferList { head: null, tail: null, length: 0 },
     length: 0,
     pipes: null,
     pipesCount: 0,
     flowing: null,
     ended: false,
     endEmitted: false,
     reading: false,
     sync: true,
     needReadable: false,
     emittedReadable: false,
     readableListening: false,
     resumeScheduled: false,
     destroyed: false,
     defaultEncoding: 'utf8',
     awaitDrain: 0,
     readingMore: false,
     decoder: null,
     encoding: null },
  readable: true,
  domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined,
  s:
   { maxTimeMS: null,
     state: 0,
     streamOptions: {},
     bson: BSON {},
     ns: 'acigeo-plus.Location',
     cmd: { aggregate: 'Location', pipeline: [Array], cursor: [Object] },
     options:
      { readPreference: [Object],
        cursor: [Object],
        promiseLibrary: [Function: Promise],
        cursorFactory: [Object],
        disconnectHandler: [Object],
        topology: [Object] },
     topology:
      Server {
        domain: null,
        _events: [Object],
        _eventsCount: 25,
        _maxListeners: Infinity,
        clientInfo: [Object],
        s: [Object] },
     topologyOptions:
      { host: 'localhost',
        port: 27017,
        disconnectHandler: [Object],
        cursorFactory: [Object],
        reconnect: true,
        emitError: true,
        size: 5,
        monitorCommands: false,
        socketOptions: {},
        socketTimeout: 360000,
        connectionTimeout: 30000,
        promiseLibrary: [Function: Promise],
        clientInfo: [Object],
        bson: BSON {} },
     promiseLibrary: [Function: Promise],
     session: undefined },
  sortValue: undefined }

而且它是空的 .


我哪里错了?

如何获得查询结果?

1 回答

  • 3

    您应该使用 toArray() 函数来接收完整结果 . 或 next() 函数通过游标逐个迭代 .

    db.collection('Location').aggregate(aggregatePipe).toArray((err, results) => {
      ...
    })
    

相关问题