javascript - Loopback如何读取mongodb上的结果聚合

标签 javascript mongodb aggregate loopbackjs loopback

我在使用 loopback 获取 mongoDB 上的聚合结果时遇到了一些问题。

这是我的环回配置:

  • "环回": "^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);
  });
});

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 }

而且错误它是空的。


我哪里错了?

如何获取查询结果?

最佳答案

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

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

关于javascript - Loopback如何读取mongodb上的结果聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49968633/

相关文章:

javascript - 原型(prototype)和原型(prototype)之间的区别._

javascript - 如何防止在 Javascript 中更改变量值

javascript - 使用 JavaScript 在原始 HTML 上查找选择范围索引

php - 用于处理访客数据的 Mongodb Schema

sql - 在没有游标的情况下合并单个SQL表中的数据

javascript - 如何在 Windows 上运行 Node 集群?

mongodb - Doctrine ODM (MongoDB) - 获取对象的完整数组?

c# - 如何使用 mongo C# 驱动程序反序列化派生类数组的特定属性。无法创建抽象类的实例

python - 使用 pandas GroupBy.agg() 对同一列进行多次聚合

concurrency - 通过应用程序配额聚合根不变性实现