首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用过滤器在FaunaDB中获取嵌套文档?

如何使用过滤器在FaunaDB中获取嵌套文档?
EN

Stack Overflow用户
提问于 2022-06-07 12:11:10
回答 1查看 36关注 0票数 0

以下查询:

代码语言:javascript
复制
  Paginate(Documents(Collection("backyard"))),
  Lambda(
    "f",
    Let(
      {
        backyard: Get(Var("f")),
        user: Get(Select(["data", "user"], Var("backyard")))
      },
      {
        backyard: Var("backyard"),
        user: Var("user")
      }
    )
  )
) 

取得的成果:

代码语言:javascript
复制
{
  data: [
    {
      backyard: {
        ref: Ref(Collection("backyard"), "333719283470172352"),
        ts: 1654518359560000,
        data: {
          user: Ref(Collection("user"), "333718599460978887"),
          product: "15358",
          date: "2022-06-06",
          counter: "1"
        }
      },
      user: {
        ref: Ref(Collection("user"), "333718599460978887"),
        ts: 1654517707220000,
        data: {
          email: "<email>",
          name: "Paolo"
        }
      }
    },
    {
      backyard: {
        ref: Ref(Collection("backyard"), "333747850716381384"),
        ts: 1654545603400000,
        data: {
          user: Ref(Collection("user"), "333718599460978887"),
          product: "15358",
          date: "2022-06-08",
          counter: "4"
        }
      },
      user: {
        ref: Ref(Collection("user"), "333718599460978887"),
        ts: 1654517707220000,
        data: {
          email: "<email>",
          name: "Paolo"
        }
      }
    }
  ]
}

如何在不丢失嵌套用户的情况下按日期过滤后院?

我试过:

代码语言:javascript
复制
Map(
  Paginate(Range(Match(Index("backyard_by_date")), "2022-05-08", "2022-06-08")),
  Lambda(
    "f",
    Let(
      {
        backyard: Get(Var("f")),
        user: Get(Select(["data", "user"], Var("backyard")))
      },
      {
        backyard: Var("backyard"),
        user: Var("user")
      }
    )
  )
)

但是,结果集是一个空数组,下面已经返回一个空数组:

代码语言:javascript
复制
Paginate(Range(Match(Index("backyard_by_date")), "2022-05-08", "2022-06-08"))

我的索引:

代码语言:javascript
复制
{
  name: "backyard_by_date",
  unique: false,
  serialized: true,
  source: "backyard"
}

也许我得调整一下我的指数?以下几点对我大有帮助:

EN

回答 1

Stack Overflow用户

发布于 2022-07-15 21:08:30

您的索引定义缺少详细信息。一旦修好了,你所做的一切都是正确的。

在您提供的索引中,没有指定termsvalues,这使得backyard_by_date索引成为“集合”索引:它只记录集合中每个文档的引用。通过这种方式,它在功能上等同于使用Documents函数,但在backyard集合中创建或更新文档时会引发额外的写操作。

要使查询工作正常,您应该删除现有索引,并(60秒后)按如下方式重新定义它:

代码语言:javascript
复制
CreateIndex({
  name: "backyard_by_date",
  source: Collection("backyard"),
  values: [
    {field: ["data", "date"]},
    {field: ["ref"]}
  ]
})

该定义配置索引以返回date字段和每个文档的引用。

让我们确认索引返回我们期望的内容:

代码语言:javascript
复制
> Paginate(Match(Index("backyard_by_date")))
{
  data: [
    [ '2022-06-06', Ref(Collection("backyard"), "333719283470172352") ],
    [ '2022-06-08', Ref(Collection("backyard"), "333747850716381384") ]
  ]
}

date字段的值放在第一位意味着我们可以在Range中有效地使用它

代码语言:javascript
复制
> Paginate(Range(Match(Index("backyard_by_date")), "2022-05-08", "2022-06-08"))
{
  data: [
    [ '2022-06-06', Ref(Collection("backyard"), "333719283470172352") ],
    [ '2022-06-08', Ref(Collection("backyard"), "333747850716381384") ]
  ]
}

并验证Range是否按预期工作:

代码语言:javascript
复制
> Paginate(Range(Match(Index("backyard_by_date")), "2022-06-07", "2022-06-08"))
{
  data: [
    [ '2022-06-08', Ref(Collection("backyard"), "333747850716381384") ]
  ]
}

现在我们知道索引正常工作了,您的筛选器查询需要做一些调整:

代码语言:javascript
复制
> Map(
  Paginate(
    Range(Match(Index("backyard_by_date")), "2022-05-08", "2022-06-08")
  ),
  Lambda(
    ["date", "ref"],
    Let(
      {
        backyard: Get(Var("ref")),
        user: Get(Select(["data", "user"], Var("backyard")))
      },
      {
        backyard: Var("backyard"),
        user: Var("user")
      }
    )
  )
)
{
  data: [
    {
      backyard: {
        ref: Ref(Collection("backyard"), "333719283470172352"),
        ts: 1657918078190000,
        data: {
          user: Ref(Collection("user"), "333718599460978887"),
          product: '15358',
          date: '2022-06-06',
          counter: '1'
        }
      },
      user: {
        ref: Ref(Collection("user"), "333718599460978887"),
        ts: 1657918123870000,
        data: { name: 'Paolo', email: '<email>' }
      }
    },
    {
      backyard: {
        ref: Ref(Collection("backyard"), "333747850716381384"),
        ts: 1657918172850000,
        data: {
          user: Ref(Collection("user"), "333718599460978887"),
          product: '15358',
          date: '2022-06-08',
          counter: '4'
        }
      },
      user: {
        ref: Ref(Collection("user"), "333718599460978887"),
        ts: 1657918123870000,
        data: { name: 'Paolo', email: '<email>' }
      }
    }
  ]
}

因为索引返回日期字符串和引用,所以Map中的Map必须接受这些值作为参数。除了将f重命名为ref之外,查询的其余部分也保持不变。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72531017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档