Index return "data" field 完全在 fauna db

Index return "data" field entirely in fauna db

我正在尝试创建一个索引,returns 集合中文档的整个数据对象; 这是代码:

CreateIndex({
  name: "users_by_data",
  source: Collection("users"),
  values: { field: ['data'] }
})

但创建后它说:Values Not set (using ref by default)

如果我专门定义字段(分别按名称),它将按预期运行,但 data 不起作用。问题是:


这是不可能的(例如出于性能原因)还是我做错了

旁注:我知道我可以在 Paginate 上执行 Lambda 函数并获得类似的结果,但这个问题具体是关于 Index 级别的;

您目前可以对常规值(字符串、数字、日期等)进行索引,并且可以对数组进行索引,该数组或多或少 'unroll' 将数组分为单独的索引条目。但是,您正在尝试的是,此时无法为对象建立索引。如果您尝试索引一个对象(如数据),它将被忽略。

目前,您有两个选择:

  • 如您所述,在查询时使用 Map/Get。
  • 列出索引中数据对象的所有值,因为您可以 select 索引中对象的特定值(但是,如果新属性稍后到达对象,则灵活性较低)

我们打算在将来支持对象索引,不过我还不能提供预计到达时间。我们的论坛上也有一个功能请求,您可以投票:https://forums.fauna.com/t/object-as-terms-instead-of-scalar-s/628

如果您只想返回数据字段,则需要对从索引返回的 Ref 使用 Select 函数。

对于单个文档,您可以这样做

Select( "data", 
 Get(
  Match(
   Index("yourIndexName"), 
   **yourIndexTerm // Could point to String/Number/FQL Ref 
  )
 )
)

对于文档列表,您可以像您所说的那样使用分页,但您仍然可以从每个文档中提取数据属性

Map(
 Paginate(
   Match(
    Index("yourIndexName"),
    **yourIndexTerm // Could point to String/Number/FQL Ref
   )
 ),
 Lambda("doc", Select("data", Get(Var("doc"))))
)