【问题标题】:Mongoose search property of a referenced object引用对象的猫鼬搜索属性
【发布时间】:2021-04-14 13:08:53
【问题描述】:

我有两个对象

第一:

const Order = {
     orderNumber: String,
     deliveryInfo: [
          {
            type: Schema.Types.ObjectId,
            ref: 'Transit',
          },
        ],
     }

秒:

 const Transit = {
     order: {
          type: Schema.Types.ObjectId,
          ref: 'Order',
        }
 }

mongoose 中是否可以通过Transit 模型查询特定订单号?

类似的东西

const query = {}
query['order.orderNumber'] = '9999'

TransitModal.find(query)

由于某种原因,我没有得到任何结果。

如果查询变成如下形状

    query.order = {
      orderNumber: 1,
    };

出现以下错误

  message: CastError: Cast to ObjectId failed for value "{ orderNumber: '9999' }" at path "order" for model "Transit"
      at model.Query.exec (/Users/eugene/Documents/development/conjure-admin/server/node_modules/mongoose/lib/query.js:4358:21)
      at Function.paginate (/Users/eugene/Documents/development/conjure-admin/server/node_modules/mongoose-paginate-v2/dist/index.js:127:49)
      at Transit._callee$ (/Users/eugene/Documents/development/conjure-admin/server/dataService/models/transit.js:80:36)
      at tryCatch (/Users/eugene/Documents/development/conjure-admin/server/node_modules/regenerator-runtime/runtime.js:63:40)
      at Generator.invoke [as _invoke] (/Users/eugene/Documents/development/conjure-admin/server/node_modules/regenerator-runtime/runtime.js:293:22)
      at Generator.next (/Users/eugene/Documents/development/conjure-admin/server/node_modules/regenerator-runtime/runtime.js:118:21)
      at asyncGeneratorStep (/Users/eugene/Documents/development/conjure-admin/server/dataService/models/transit.js:24:103)
      at _next (/Users/eugene/Documents/development/conjure-admin/server/dataService/models/transit.js:26:194)
      at /Users/eugene/Documents/development/conjure-admin/server/dataService/models/transit.js:26:364
      at new Promise (<anonymous>)
      at Transit.<anonymous> (/Users/eugene/Documents/development/conjure-admin/server/dataService/models/transit.js:26:97)
      at Transit.findPaginated (/Users/eugene/Documents/development/conjure-admin/server/dataService/models/transit.js:163:31)
      at _callee$ (/Users/eugene/Documents/development/conjure-admin/server/controller/transit.controller.js:41:41)
      at tryCatch (/Users/eugene/Documents/development/conjure-admin/server/node_modules/regenerator-runtime/runtime.js:63:40)
      at Generator.invoke [as _invoke] (/Users/eugene/Documents/development/conjure-admin/server/node_modules/regenerator-runtime/runtime.js:293:22)
      at Generator.next (/Users/eugene/Documents/development/conjure-admin/server/node_modules/regenerator-runtime/runtime.js:118:21)
      at asyncGeneratorStep (/Users/eugene/Documents/development/conjure-admin/server/controller/transit.controller.js:32:103)
      at _next (/Users/eugene/Documents/development/conjure-admin/server/controller/transit.controller.js:34:194)
      at /Users/eugene/Documents/development/conjure-admin/server/controller/transit.controller.js:34:364
      at new Promise (<anonymous>)
      at /Users/eugene/Documents/development/conjure-admin/server/controller/transit.controller.js:34:97
      at /Users/eugene/Documents/development/conjure-admin/server/controller/transit.controller.js:10:1
      at Layer.handle [as handle_request] (/Users/eugene/Documents/development/conjure-admin/server/node_modules/express/lib/router/layer.js:95:5)
      at next (/Users/eugene/Documents/development/conjure-admin/server/node_modules/express/lib/router/route.js:137:13)
      at Route.dispatch (/Users/eugene/Documents/development/conjure-admin/server/node_modules/express/lib/router/route.js:112:3)
      at Layer.handle [as handle_request] (/Users/eugene/Documents/development/conjure-admin/server/node_modules/express/lib/router/layer.js:95:5)
      at /Users/eugene/Documents/development/conjure-admin/server/node_modules/express/lib/router/index.js:281:22
      at Function.process_params (/Users/eugene/Documents/development/conjure-admin/server/node_modules/express/lib/router/index.js:335:12) {
    messageFormat: undefined,
    stringValue: `"{ orderNumber: '9999' }"`,
    kind: 'ObjectId',
    value: { orderNumber: '9999' },
    path: 'order',
    reason: Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
        at new ObjectID (/Users/eugene/Documents/development/conjure-admin/server/node_modules/bson/lib/bson/objectid.js:59:11)
        at castObjectId (/Users/eugene/Documents/development/conjure-admin/server/node_modules/mongoose/lib/cast/objectid.js:25:12)
        at ObjectId.cast (/Users/eugene/Documents/development/conjure-admin/server/node_modules/mongoose/lib/schema/objectid.js:267:12)
        at ObjectId.SchemaType.applySetters (/Users/eugene/Documents/development/conjure-admin/server/node_modules/mongoose/lib/schematype.js:1075:12)
        at ObjectId.SchemaType._castForQuery (/Users/eugene/Documents/development/conjure-admin/server/node_modules/mongoose/lib/schematype.js:1510:15)
        at ObjectId.SchemaType.castForQuery (/Users/eugene/Documents/development/conjure-admin/server/node_modules/mongoose/lib/schematype.js:1500:15)
        at ObjectId.SchemaType.castForQueryWrapper (/Users/eugene/Documents/development/conjure-admin/server/node_modules/mongoose/lib/schematype.js:1477:20)
        at cast (/Users/eugene/Documents/development/conjure-admin/server/node_modules/mongoose/lib/cast.js:274:34)
        at model.Query.Query.cast (/Users/eugene/Documents/development/conjure-admin/server/node_modules/mongoose/lib/query.js:4759:12)
        at model.Query.<anonymous> (/Users/eugene/Documents/development/conjure-admin/server/node_modules/mongoose/lib/query.js:2238:10)
        at model.Query._wrappedThunk [as _countDocuments] (/Users/eugene/Documents/development/conjure-admin/server/node_modules/mongoose/lib/helpers/query/wrapThunk.js:16:8)
        at /Users/eugene/Documents/development/conjure-admin/server/node_modules/kareem/index.js:369:33
        at processTicksAndRejections (internal/process/task_queues.js:79:11)
  },

【问题讨论】:

    标签: mongodb mongoose mongodb-query mongoose-populate


    【解决方案1】:
    TransitModal.aggregate(
      [
        { "$lookup": {
          "from": ItemOrders.collection.name,
          "localField": "order",
          "foreignField": "_id",
          "as": "order"
        }},
        { "$unwind": "$order" },
        { "$match": { "order.orderNumber" : '9999' } } },
      ],
      function(err, result) {
        // do something
      }
    )
    

    【讨论】:

    • 必须有一种方法可以在不聚合的情况下做到这一点
    【解决方案2】:

    试试这个:

    TransitModal.find({}).populate('order').exec((err, transits) => {
      transits= transits.filter((transit) =>{
        return transit.order.orderNumber === '9999' ; 
      });
    });
    

    【讨论】:

    • 是的不起作用。完全一样。
    • 我希望 ODM 在这种情况下 mongoose 做查询工作。
    猜你喜欢
    • 2012-11-02
    • 2015-05-31
    • 2017-10-23
    • 2016-03-13
    • 2020-02-21
    • 2017-01-07
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多