Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在sequelize with postgres中按嵌套对象值查找_Node.js_Postgresql_Sequelize.js - Fatal编程技术网

Node.js 在sequelize with postgres中按嵌套对象值查找

Node.js 在sequelize with postgres中按嵌套对象值查找,node.js,postgresql,sequelize.js,Node.js,Postgresql,Sequelize.js,我试图从嵌套的对象数组中找到一个值,但我无法使它工作 假设我有一个名为Forms的表,这个表有一个名为collaborator的对象数组 collaborator:DataTypes.ARRAY(DataTypes.JSONB) 此collaborator数组中的典型json对象是: { “id”:4, “姓名”:“约翰” } 我正在尝试根据collaborator.name值查找表单。到目前为止,我尝试了这个(通过各种其他问题和谷歌搜索),但它返回了null Form.findOne({

我试图从嵌套的对象数组中找到一个值,但我无法使它工作

假设我有一个名为
Forms
的表,这个表有一个名为
collaborator
的对象数组

collaborator:DataTypes.ARRAY(DataTypes.JSONB)
此collaborator数组中的典型json对象是:

{
“id”:4,
“姓名”:“约翰”
}
我正在尝试根据
collaborator.name
值查找
表单。到目前为止,我尝试了这个(通过各种其他问题和谷歌搜索),但它返回了
null

Form.findOne({
其中:{
“合作者.姓名”:“约翰”
}
})
我正在阅读sequelize本身的这本手册,但我认为我做错了什么:

您可以使用
sequelize.query
功能执行

“续集”:“^5.21.3”
postgres:9.6
,例如

从'../../db'导入{sequelize};
从“sequelize”导入{Model,DataTypes,QueryTypes};
类形式扩展了模型{}
Form.init(
{
身份证:{
类型:DataTypes.INTEGER,
自动递增:真,
primaryKey:没错,
},
协作者:DataTypes.ARRAY(DataTypes.JSONB),
},
{sequelize,tableName:'forms'},
);
(异步函数测试(){
试一试{
wait sequelize.sync({force:true});
//种子
等待Form.bulkCreate([
{合作者:[{id:1,名称:'teresa'}]},
{合作者:[{id:2,名称:'teng'}]},
{协作者:[{id:3,名称:'slideshowp2'}]},
{
合作者:[
{id:4,名字:'John'},
{id:5,名字:'Tim'},
],
},
]);
//试验
const data=wait sequelize.query(
`
选择id,合作者
从表单f,jsonb_数组_元素(到jsonb(f.collaborator))obj
其中obj->>'name'='John';
`,
{type:QueryTypes.SELECT},
);
log(JSON.stringify(data));
}捕获(错误){
console.log(错误);
}最后{
等待续集。关闭();
}
})();
执行结果:

Executing (default): DROP TABLE IF EXISTS "forms" CASCADE;
Executing (default): DROP TABLE IF EXISTS "forms" CASCADE;
Executing (default): CREATE TABLE IF NOT EXISTS "forms" ("id"  SERIAL , "collaborator" JSONB[], PRIMARY KEY ("id"));
Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND t.relkind = 'r' and t.relname = 'forms' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname;
Executing (default): INSERT INTO "forms" ("id","collaborator") VALUES (DEFAULT,ARRAY['{"id":1,"name":"teresa"}']::JSONB[]),(DEFAULT,ARRAY['{"id":2,"name":"teng"}']::JSONB[]),(DEFAULT,ARRAY['{"id":3,"name":"slideshowp2"}']::JSONB[]),(DEFAULT,ARRAY['{"id":4,"name":"John"}','{"id":5,"name":"Tim"}']::JSONB[]) RETURNING *;
Executing (default): SELECT id, collaborator
        FROM   forms f, jsonb_array_elements(to_jsonb(f.collaborator)) obj
        WHERE  obj->>'name' = 'John';
[{"id":4,"collaborator":[{"id":4,"name":"John"},{"id":5,"name":"Tim"}]}]
检查数据库:

node-sequelize-examples=# select * from forms;
 id |                             collaborator                             
----+----------------------------------------------------------------------
  1 | {"{\"id\": 1, \"name\": \"teresa\"}"}
  2 | {"{\"id\": 2, \"name\": \"teng\"}"}
  3 | {"{\"id\": 3, \"name\": \"slideshowp2\"}"}
  4 | {"{\"id\": 4, \"name\": \"John\"}","{\"id\": 5, \"name\": \"Tim\"}"}
(4 rows)

node-sequelize-examples=# \d+ forms
                                                Table "public.forms"
    Column    |  Type   |                     Modifiers                      | Storage  | Stats target | Description 
--------------+---------+----------------------------------------------------+----------+--------------+-------------
 id           | integer | not null default nextval('forms_id_seq'::regclass) | plain    |              | 
 collaborator | jsonb[] |                                                    | extended |              | 
Indexes:
    "forms_pkey" PRIMARY KEY, btree (id)
您可以使用
sequelize.query
功能执行

“续集”:“^5.21.3”
postgres:9.6
,例如

从'../../db'导入{sequelize};
从“sequelize”导入{Model,DataTypes,QueryTypes};
类形式扩展了模型{}
Form.init(
{
身份证:{
类型:DataTypes.INTEGER,
自动递增:真,
primaryKey:没错,
},
协作者:DataTypes.ARRAY(DataTypes.JSONB),
},
{sequelize,tableName:'forms'},
);
(异步函数测试(){
试一试{
wait sequelize.sync({force:true});
//种子
等待Form.bulkCreate([
{合作者:[{id:1,名称:'teresa'}]},
{合作者:[{id:2,名称:'teng'}]},
{协作者:[{id:3,名称:'slideshowp2'}]},
{
合作者:[
{id:4,名字:'John'},
{id:5,名字:'Tim'},
],
},
]);
//试验
const data=wait sequelize.query(
`
选择id,合作者
从表单f,jsonb_数组_元素(到jsonb(f.collaborator))obj
其中obj->>'name'='John';
`,
{type:QueryTypes.SELECT},
);
log(JSON.stringify(data));
}捕获(错误){
console.log(错误);
}最后{
等待续集。关闭();
}
})();
执行结果:

Executing (default): DROP TABLE IF EXISTS "forms" CASCADE;
Executing (default): DROP TABLE IF EXISTS "forms" CASCADE;
Executing (default): CREATE TABLE IF NOT EXISTS "forms" ("id"  SERIAL , "collaborator" JSONB[], PRIMARY KEY ("id"));
Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND t.relkind = 'r' and t.relname = 'forms' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname;
Executing (default): INSERT INTO "forms" ("id","collaborator") VALUES (DEFAULT,ARRAY['{"id":1,"name":"teresa"}']::JSONB[]),(DEFAULT,ARRAY['{"id":2,"name":"teng"}']::JSONB[]),(DEFAULT,ARRAY['{"id":3,"name":"slideshowp2"}']::JSONB[]),(DEFAULT,ARRAY['{"id":4,"name":"John"}','{"id":5,"name":"Tim"}']::JSONB[]) RETURNING *;
Executing (default): SELECT id, collaborator
        FROM   forms f, jsonb_array_elements(to_jsonb(f.collaborator)) obj
        WHERE  obj->>'name' = 'John';
[{"id":4,"collaborator":[{"id":4,"name":"John"},{"id":5,"name":"Tim"}]}]
检查数据库:

node-sequelize-examples=# select * from forms;
 id |                             collaborator                             
----+----------------------------------------------------------------------
  1 | {"{\"id\": 1, \"name\": \"teresa\"}"}
  2 | {"{\"id\": 2, \"name\": \"teng\"}"}
  3 | {"{\"id\": 3, \"name\": \"slideshowp2\"}"}
  4 | {"{\"id\": 4, \"name\": \"John\"}","{\"id\": 5, \"name\": \"Tim\"}"}
(4 rows)

node-sequelize-examples=# \d+ forms
                                                Table "public.forms"
    Column    |  Type   |                     Modifiers                      | Storage  | Stats target | Description 
--------------+---------+----------------------------------------------------+----------+--------------+-------------
 id           | integer | not null default nextval('forms_id_seq'::regclass) | plain    |              | 
 collaborator | jsonb[] |                                                    | extended |              | 
Indexes:
    "forms_pkey" PRIMARY KEY, btree (id)