如何仅通过RethinkDB中的查询获得一个文档?

例如,我想通过以下查询获取文档:

 let searchQuery = {
    name: 'rob'
 }

var cursor = await r.table('users').filter(searchQuery).run(connection)
  var user = await cursor.toArray()
  console.log(user)


结果:

[ { email: 'fooz@bar.com',
    id: '00e18124-714b-4298-aa34-5126ebda8828',
    name: 'rob' } ]


Filter method实际上返回一个同名的list of users-'rob'。

我想要类似get method的结果:

r.table('posts').get('a9849eef-7176-4411-935b-79a6e3c56a74').run(conn, callback);


结果:

{ email: 'fooz@bar.com',
  id: '00e18124-714b-4298-aa34-5126ebda8828',
  name: 'rob' }


但是此方法仅使用文档ID。

有任何想法吗?

最佳答案

get(按id)按设计可提取单个行选择,但filter是一种流处理,可处理多个值(如数组和流)。您可能想使用nth,该符号旨在按其位置或紧密替代的()查询流/数组元素。这是一个例子:

.filter({ name: 'rob' })`


将返回一个类似的数组

[{"email":"fooz@bar.com","id":"230de013-5d6a-436e-a7e9-a891c01913e5","name":"rob"}]


但是以下查询

.filter({ name: 'rob' }).nth(0)
.filter({ name: 'rob' })(0)


都会回来

{"email":"fooz@bar.com","id":"230de013-5d6a-436e-a7e9-a891c01913e5","name":"rob"}


请注意,如果未找到任何行,两者也都会抛出ReqlNonExistenceError: Index out of bounds: 0。但是,您可以使用default运算符轻松修复它:

.filter({ name: 'not-rob' }).nth(0).default(null)


使用RethinkDB数据浏览器进行了测试,并且“原始视图”选项卡处于活动状态,因为“树视图”和“表视图”都将单个元素的数组显示为单个对象。我几乎可以肯定RethinkDB查询引擎足够聪明,可以使使用nth(0)效率更高,而不是将整个游标提取到数组中并在代码中采用后者的第一个元素。

10-01 15:41
查看更多