创建一个以电子邮件地址为唯一标识符的记录[JavaScript客户端(Node.js包)- SurrealDB]

qij5mzcb  于 2022-12-29  发布在  Node.js
关注(0)|答案(1)|浏览(117)

我正在尝试使用以下代码创建person记录:

import Surreal from 'surrealdb.js';
...
const peopleFromSomewhere = await someProvider.getAllPeople();

// [{ email: 'some@email.com', fullName: 'Some Name' }, ... ]

for (const person of peopleFromSomewhere) {
  const created = await db.create('person', {
    email: person.email,
    fullName: person.fullName
  });
})

这将创建一个带有随机生成的唯一标识符的记录,例如:

{ 
  email: 'some@email.com',
  fullName: 'Some Name',
  id: 'person:b5pfovinz7zkxlz3s8er'
}

但是如果我再次运行相同的代码,将插入相同的数据,只是使用不同的UID。
我想使用email作为一个'主键'(使用关系数据库术语)-以避免插入相同的person两次,具有完全相同的细节(电子邮件地址和全名)。

const created = await db.create(`person:${person.email}`, {
    email: person.email,
    fullName: person.fullName
  });

只给我:

{ 
  email: 'some@email.com',
  fullName: 'Some Name',
  id: '⟨`person:some@email.com`⟩:w9m4l31bwti4472tdoax'
}

在我看来不太对劲。
我期望:

{ 
  email: 'some@email.com',
  fullName: 'Some Name',
  id: 'person:'some@email.com''
}

如何使用电子邮件地址的唯一ID创建person记录,以便不会两次插入相同的数据?

z9zf31ra

z9zf31ra1#

要创建具有复杂字符(如@符号)的记录ID,必须用```或字符将ID括起来。
使用这样的ID创建记录的查询如下所示:

CREATE user:⟨some@mail.com⟩ SET
  email = 'some@mail.com',
  fullName = 'Some Name'
;

这将转换为使用node.js驱动程序的以下查询:

let created = await db.create(`person:⟨${person.email}⟩`, {
  email: person.email,
  fullName: person.fullName
})

数据库返回的记录始终包含,即使您用```字符将ID括起来。

[
    {
        "time": "73µs",
        "status": "OK",
        "result": [
            {
                "email": "some@mail.com",
                "fullName": "some name",
                "id": "person:⟨some@mail.com⟩"
            }
        ]
    }
]

相关问题