【问题标题】:Mongodb get error message "MongoError: Path collision at activity"Mongodb 收到错误消息“MongoError:活动中的路径冲突”
【发布时间】:2021-12-15 03:33:41
【问题描述】:

我在我的 node.js 项目中为 mongodb 使用 mongoose 库。在我的日志文件中收到 mongodb 错误消息:

{
  message: 'Path collision at activity',
  stack: 'MongoError: Path collision at activity\n' +
    '    at Connection.<anonymous> (/project/node_modules/mongoose/node_modules/mongodb-core/lib/connection/pool.js:443:61)\n' +
    '    at Connection.emit (events.js:315:20)\n' +
    '    at Connection.EventEmitter.emit (domain.js:483:12)\n' +
    '    at processMessage (/project/node_modules/mongoose/node_modules/mongodb-core/lib/connection/connection.js:364:10)\n' +
    '    at Socket.<anonymous> (/project/node_modules/mongoose/node_modules/mongodb-core/lib/connection/connection.js:533:15)\n' +
    '    at Socket.emit (events.js:315:20)\n' +
    '    at Socket.EventEmitter.emit (domain.js:483:12)\n' +
    '    at addChunk (_stream_readable.js:295:12)\n' +
    '    at readableAddChunk (_stream_readable.js:271:9)\n' +
    '    at Socket.Readable.push (_stream_readable.js:212:10)\n' +
    '    at TCP.onStreamRead (internal/stream_base_commons.js:186:23)',
  operationTime: Timestamp { _bsontype: 'Timestamp', low_: 2, high_: 1600849377 },
  ok: 0,
  errmsg: 'Path collision at activity',
  code: 31250,
  codeName: 'Location31250',
  '$clusterTime': {
    clusterTime: Timestamp { _bsontype: 'Timestamp', low_: 2, high_: 1600849377 },
    signature: {
      hash: Binary {
        _bsontype: 'Binary',
        sub_type: 0,
        position: 20,
        buffer: <Buffer d2 34 b7 ac bc a7 3f ea 38 d1 5c e3 26 58 39 43 d8 11 6c 83>
      },
      keyId: Long { _bsontype: 'Long', low_: 4, high_: 1596659428 }
    }
  },
  name: 'MongoError',
  level: 'info',
  timestamp: '2020-09-23 08:22:57',
  [Symbol(mongoErrorContextSymbol)]: {}
}

这个错误没有指向哪个函数返回这个错误的错误位置。 如果有人有任何线索,请告诉我。提前致谢。

【问题讨论】:

  • 发送的查询是什么?
  • 其实这是因为你写错了查询

标签: mongodb mongoose


【解决方案1】:

问题应该取决于投影。自 v4.4 以来,此错误是作为重大更改的一部分引入的。

来自MongoDB 4.4 release notes here

路径冲突:嵌入式文档及其字段

从 MongoDB 4.4 开始,使用嵌入文档的任何字段投影嵌入文档都是非法的。

例如,考虑一个包含包含 size 字段的文档的集合清单:

{ ..., size: { h: 10, w: 15.25, uom: "cm" }, ... }

从 MongoDB 4.4 开始,以下操作因路径冲突错误而失败,因为它尝试同时投影 size 文档和 size.uom 字段:

db.inventory.find( {}, { size: 1, "size.uom": 1 } )  // Invalid starting in 4.4

在以前的版本中,嵌入文档与其字段之间的最后一个投影决定了投影:

  • 如果嵌入文档的投影出现在其字段的任何和所有投影之后,MongoDB 会投影嵌入文档。例如,投影文档{ "size.uom": 1, size: 1 } 产生的结果与投影文档{ size: 1 } 相同。
  • 如果嵌入文档的投影出现在其任何字段的投影之前,MongoDB 会投影指定的一个或多个字段。例如,投影文档{ "size.uom": 1, size: 1, "size.h": 1 } 产生与投影文档{ "size.uom": 1, "size.h": 1 } 相同的结果

【讨论】:

    【解决方案2】:

    作为记录,当我想选择填充集合的一组字段并对其进行分页时,我得到了这个错误。以 author-book 为例:

    author: {
      _id: ObjectId
      name: String,
      birthday: String,
      ...,
      books: [
        _id: ObjectId,
        _id: ObjectId,
      ]
    }
    
    book: {
      _id: ObjectId,
      title: String,
      publisher: String,
      year: string,
      ...
    }
    

    我试图对作者的 5 本书进行分页,并使用以下方法选择 titleyear 字段:

    Author.findById(author_id)
      .populate('books')
      .select('books': { $slice: { [offset, limit + offset] } })
      .select('books books.title books.year');
    

    这是引发错误。相反,通过在populate 函数上使用select 属性来解决它:

    Author.findById(author_id)
      .populate(
        path: 'books',
        select: 'title year'
      )
      .select('books': { $slice: { [offset, limit + offset] } });
    

    【讨论】:

      【解决方案3】:

      与 MongoDB 最新版本相关的问题。请从here下载v4.0.20

      You can download old version by changing here

      【讨论】:

        猜你喜欢
        • 2022-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-30
        • 1970-01-01
        • 1970-01-01
        • 2017-01-06
        • 1970-01-01
        相关资源
        最近更新 更多