Node.js Sequelize,如何使用Op.contains查找具有特定值的模型

Node.js Sequelize,如何使用Op.contains查找具有特定值的模型,node.js,postgresql,express,sequelize.js,Node.js,Postgresql,Express,Sequelize.js,我正在做一些关于出租房屋和公寓的项目,我已经达到了需要根据房屋的功能(wifi、安全和其他工作人员)实施过滤房屋的地步。起初,我决定第一次尝试使用Sequelize ORM。像添加、创建、编辑之类的工作都很好,但是过滤部分是我遇到一些问题的地方 我正在与nodejs、express和postgresql合作。 我需要找到所有在特征ID数组中列出特征的房屋。这是我试过的。在本例中,我尝试获取具有IDs1、2和4特征的房屋 db.House.findAll({ include: [{ m

我正在做一些关于出租房屋和公寓的项目,我已经达到了需要根据房屋的功能(wifi、安全和其他工作人员)实施过滤房屋的地步。起初,我决定第一次尝试使用Sequelize ORM。像添加、创建、编辑之类的工作都很好,但是过滤部分是我遇到一些问题的地方

我正在与nodejs、express和postgresql合作。 我需要找到所有在特征ID数组中列出特征的房屋。这是我试过的。在本例中,我尝试获取具有IDs1、2和4特征的房屋

db.House.findAll({
  include: [{
    model: db.HouseFeature, 
    as: 'HouseFeatures',
    where: {
      featureId: {
        [Op.contains]: [1, 2, 4] //<- array of featuresIds
      }  
    }
  }]
})
HouseFeature包含featureId字段。 以下是我得到的错误:

error: оператор не существует: integer @> unknown
       at Connection.parseE (C:\***\server\node_modules\pg\lib\connection.js:601:11)
       at Connection.parseMessage (C:\***\server\node_modules\pg\lib\connection.js:398:19)
       at Socket.<anonymous> (C:\***\server\node_modules\pg\lib\connection.js:120:22)
       at Socket.emit (events.js:182:13)
       at addChunk (_stream_readable.js:283:12)
       at readableAddChunk (_stream_readable.js:264:11)
       at Socket.Readable.push (_stream_readable.js:219:10)
       at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
     name: 'error',
     length: 397,
     severity: 'ОШИБКА',
     code: '42883',
     detail: undefined,
     hint:
      'Оператор с данными именем и типами аргументов не найден. Возможно, вам следует добавить явные приведения типов.',
     position: '851',
     internalPosition: undefined,
     internalQuery: undefined,
     where: undefined,
     schema: undefined,
     table: undefined,
     column: undefined,
     dataType: undefined,
     constraint: undefined,
     file:
      'd:\\pginstaller.auto\\postgres.windows-x64\\src\\backend\\parser\\parse_oper.c',
     line: '731',
     routine: 'op_error',
     sql:
      'SELECT "House"."id", "House"."title", "House"."description", "House"."price", "House"."address", "House"."lat", "House"."lon", "House"."kitchen", "House"."bathrooms", "House"."floor", "House"."totalFloors", "House"."people", "House"."area", "House"."bedrooms", "House"."trusted", "House"."createdAt", "House"."updatedAt", "House"."CityId", "House"."ComplexId", "House"."OwnerProfileId", "House"."HouseTypeId", "House"."RentTypeId", "HouseFeatures"."id" AS "HouseFeatures.id", "HouseFeatures"."featureId" AS "HouseFeatures.featureId", "HouseFeatures"."createdAt" AS "HouseFeatures.createdAt", "HouseFeatures"."updatedAt" AS "HouseFeatures.updatedAt", "HouseFeatures"."HouseId" AS "HouseFeatures.HouseId" FROM "Houses" AS "House" INNER JOIN "HouseFeatures" AS "HouseFeatures" ON "House"."id" = "HouseFeatures"."HouseId" AND "HouseFeatures"."featureId" @> \'1,2\';'

现在我有一个小问题。我是否可以将HouseFeatureModel与FeatureModel链接起来,以便稍后获取Feature图标图像和名称?将要素ID存储在HouseFeature数组中。

请检查
Op.in
Op.contains
之间的差异:

[Op.in]:[1,2],//in[1,2]

[Op.contains]:[1,2]/@>[1,2](PG数组包含运算符)

它看起来像是
houseffeatures.featureId
是类型为
integer
的PK,而不是
postgres数组

请尝试:

db.House.findAll({
  include: [{
    model: db.HouseFeature, 
    as: 'HouseFeatures',
    where: {
      featureId: {
        [Op.in]: [1, 2, 3]
      }  
    }
  }]
})
甚至

db.House.findAll({
  include: [{
    model: db.HouseFeature, 
    as: 'HouseFeatures',
    where: {
      featureId: [1, 2, 3]
    }
  }]
})

相反

你的意思是,你想获得包含id(数组之一)的房屋吗?也许你在寻找
Op.in
操作符而不是
Op.contains
?Op.contains似乎是用于Postgres数组类型。。。但是你的模型看起来是1:M。。。。那么也许@Ihor是对的?你在寻找具有所有这些特征的房子吗?或者,至少具有其中一个特征的房屋?用户可以创建房屋并在其中设置特征。其他用户可以根据功能过滤房屋。例如,用户可以找到具有wifi、阳台和停车功能的房屋。我需要我的查询返回具有选定功能的房屋。似乎你是对的。HouseFeatures.featureId为整数。但我已经试过Op.in了,我遇到了一个问题——如果房子有多个功能,它会多次返回同一个房子。例如,如果我要求提供具有3个特征的房屋,Op.in返回同一房屋3次。对我来说效果很好-返回具有房屋特征列表的独特房屋阵列
db.House.findAll({
  include: [{
    model: db.HouseFeature, 
    as: 'HouseFeatures',
    where: {
      featureId: {
        [Op.in]: [1, 2, 3]
      }  
    }
  }]
})
db.House.findAll({
  include: [{
    model: db.HouseFeature, 
    as: 'HouseFeatures',
    where: {
      featureId: [1, 2, 3]
    }
  }]
})