微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

索引:按布尔搜索?

如何解决索引:按布尔搜索?

我在使用 FaunaDB 索引时遇到了一些问题。 FQL 非常强大,但文档似乎(目前)仅限于几个示例/用例。 (按字符串搜索

我有一个订单集合,有几个字段:状态、ID、客户、材料和日期。

我的目标是根据订单的状态、OPEN 或 CLOSED(布尔值真/假)搜索/过滤订单。

这是我创建的索引:

CreateIndex({
  name: "orders_all_by_open_asc",unique: false,serialized: true,source: Collection("orders"),terms: [{ field: ["data","status"] }],values: [
    { field: ["data","unique_id"] },{ field: ["data","client"] },"material"] },"date"] }
  ]
}

所以对于这个索引,我想指定 TRUE 或 FALSE 并获取所有相应的订单,包括它们的数据(字段)。

我有两个问题:

  1. 当我使用 Javascript 驱动程序传递 TRUE 或 FALSE 时,没有返回任何内容:( 是否可以通过布尔值进行搜索,或者仅通过字符串/数字进行搜索

这是我的查询(在 FQL 中,使用 Shell):

Match(Index("orders_all_by_open_asc"),true)

不幸的是,没有返回任何内容。我可能做错了。

  1. 第二个问题(稍微不相关)。当我创建一个索引并指定一堆值时,返回的数据似乎是数组格式,只有值,而不是字段。一个例子:
[
  1001,"client1","concrete","2021-04-13T00:00:00.000Z",],[
  1002,"client2","wood",]

这种格式对我不利,因为我的前端希望接收一个以字段为键、以值为属性的对象。示例:

data:
{
  unique_id : 1001,client : "client1",material : "concrete",date: "2021-04-13T00:00:00.000Z"
},{
  unique_id : 1002,client : "client2",material : "wood",etc..

在使用索引值时,有什么方法可以同时获取字段和值,还是总是返回数组(而不是对象)?

我可以为此使用 Lambda 或其他东西吗?

我确实有另一个使用 Map 和 Lambda 效果良好的查询,并返回整个文档,包括 Ref 和 Data 字段:

      Map(
        Paginate(
          Match(Index("orders_by_date"),date),),Lambda('item',Get(Var('item')))
      )

这很有效,但不幸的是,它还会为每个返回的文档执行一个 Get 请求,这似乎非常低效。

我想要构建的这个新索引用于按订单状态过滤,将用于返回数百个订单,每天数百次。所以我试图让它尽可能高效,但如果它只能返回一个数组,它就没有用了。

提前致谢!!索引很棒,但很难掌握,所以任何见解都将不胜感激。

解决方法

  1. 您没有向我们展示您所做的一切,因此这里有一个示例,说明使用您按原样创建的索引确实可以对布尔值进行过滤:

    > CreateCollection({ name: "orders" })
    {
      ref: Collection("orders"),ts: 1618350087320000,history_days: 30,name: 'orders'
    }
    > Create(Collection("orders"),{ data: {
        unique_id: 1,client: "me",material: "stone",date: Now(),status: true
    }})
    {
      ref: Ref(Collection("orders"),"295794155241603584"),ts: 1618350138800000,data: {
        unique_id: 1,client: 'me',material: 'stone',date: Time("2021-04-13T21:42:18.784Z"),status: true
      }
    }
    > Create(Collection("orders"),{ data: {
      unique_id: 2,client: "you",material: "muslin",status: false
    }})
    {
      ref: Ref(Collection("orders"),"295794180038328832"),ts: 1618350162440000,data: {
        unique_id: 2,client: 'you',material: 'muslin',date: Time("2021-04-13T21:42:42.437Z"),status: false
      }
    }
    > CreateIndex({
      name: "orders_all_by_open_asc",unique: false,serialized: true,source: Collection("orders"),terms: [{ field: ["data","status"] }],values: [
        { field: ["data","unique_id"] },{ field: ["data","client"] },"material"] },"date"] }
      ]
    })
    {
      ref: Index("orders_all_by_open_asc"),ts: 1618350185940000,active: true,name: 'orders_all_by_open_asc',terms: [ { field: [ 'data','status' ] } ],values: [
        { field: [ 'data','unique_id' ] },{ field: [ 'data','client' ] },'material' ] },'date' ] }
      ],partitions: 1
    }
    > Paginate(Match(Index("orders_all_by_open_asc"),true))
    { data: [ [ 1,'me','stone',Time("2021-04-13T21:42:18.784Z") ] ] }
    > Paginate(Match(Index("orders_all_by_open_asc"),false))
    { data: [ [ 2,'you','muslin',Time("2021-04-13T21:42:42.437Z") ] ] }
    
  2. 需要更多的工作,但您可以编写任何您喜欢的返回格式:

    > Map(
      Paginate(Match(Index("orders_all_by_open_asc"),false)),Lambda(
        ["unique_id","client","material","date"],{
          unique_id: Var("unique_id"),client: Var("client"),material: Var("material"),date: Var("date"),}
      )
    )
    {
      data: [
        {
          unique_id: 2,date: Time("2021-04-13T21:42:42.437Z")
        }
      ]
    }
    

    它仍然是一个结果数组,但现在每个结果都是一个具有适当字段名称的对象。

,

对 FQL 不太熟悉,但对 SQL 语言有点熟悉。本质上,数据库语言通常将您的所有值视为字符串,直到它们不再需要为止。相反,您的查询应该使用 FQL 期望的字符串定义。我相信在您的情况下它应该是 OPEN 或 CLOSED。您可以在 java 中简单地使用 if 语句来确定是搜索“OPEN”还是“CLOSED”。

要回答您的第二个问题,我不知道 FQL,但如果这是返回的内容,那么您使用 lamda 的方法似乎没问题。除了希望您能以不同的方式在未来某个地方获取 API 表单中的条目外,您无法从您的角度做更多其他事情。归根结底,这种情况下的 O(n) 操作还算不错,只需返回一百个左右的订单应该不是世界上最痛苦的事情。

如果你真的很担心这个,你可以把请求分成几部分,这样你只返回前 100 个,然后当前端想要下一个集合时,你发送下一个 100。你也可以缓存结果来制作从前端的角度来看,它非常快。

,

另一个建议,也许我错了并且在搜索文档时失败了,但无论如何我都会发布以防万一它有帮助。

我的索引未能返回对象,此处的示例数据是 client 字段:

  "data": {
    "status": "LIVRAISON","open": true,"unique_id": 1001,"client": {
      "name": "TEST1","contact_name": "Bob","email": "bob@client.com","phone": "555-555-5555"
    

此处,client 字段返回空值,即使它在索引中指定。

阅读文档,这里:https://docs.fauna.com/fauna/current/api/fql/indexes?lang=javascript#value

Value Objects 部分,我能够理解对于对象,索引字段必须定义为一个数组,每个对象键一个。我的数据示例:

{ field: ['data','client','name'] },{ field: ['data','contact_name'] },'email'] },'phone'] },

这有点令人困惑,因为我的初学者大脑期望定义“client”字段会简单地返回整个对象,如下所示:

{ field: ['data','client'] },

文档中唯一关于此的部分是这句话:The field ["data","address","street"] refers to the street field contained in an address object within the document’s data object.

这是足够的信息,但也许它应该有一个单独的部分,有一个更长的例子?当然,这个简单的句子是有效的,但如果有一个名为“向字段添加对象”之类的小节,这会让它变得更加清晰。

希望我的困惑时刻会有所帮助。到目前为止喜欢 FaunaDB,继续努力:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。