【问题标题】:Query returning results when it shouldn't | DocumentDB查询不应该返回的结果 |文档数据库
【发布时间】:2017-03-16 12:22:03
【问题描述】:

在查询下面运行时,它会从集合中返回记录:

SELECT * 
FROM Families f 
WHERE f.id = "AndersenFamily"

我也在 C# 中尝试过,得到了相同的结果:

query = client.CreateDocumentQuery<Family>(collectionLink, new SqlQuerySpec
            {
                QueryText = "SELECT * FROM Families f WHERE (f.id = @name)",
                Parameters = new SqlParameterCollection()  {
                          new SqlParameter("@name", "AndersenFamily")
                     }
            });

“家庭”有什么意义? ASFAIK 它不是数据库名称、集合名称或任何文档名称,那么为什么它会返回结果?

我也尝试用一些不同的词替换“家庭”,但我仍然得到了结果。

你可以在这里看到代码https://docs.microsoft.com/en-us/azure/documentdb/documentdb-sql-query

【问题讨论】:

  • 您是在从 C# 运行查询时看到,还是仅在 Playground 中看到?如果它在操场上,它可能是操场特定的方面,与 C# 无关。 (老实说,我强烈怀疑这与 C# 或 .NET 无关。)
  • @Skeet 它在 C# 代码中。我已经更新了问题。
  • 嗯。考虑到操场上的行为,我仍然认为这真的只是一个 DocumentDb 问题,.NET 和 C# 的知识是无关紧要的。老实说,文档并不是很清楚——尽管它确实说 FROM 子句在大多数情况下是可选的。

标签: c# .net azure azure-cosmosdb


【解决方案1】:

DocumentDB 支持使用 SQL 语法进行查询,但由于它实际上是 NoSQL 存储,因此不存在表的概念。

在 DocumentDB 上构建 SQL 查询时,FROM 子句(可选)specifies the source 可以包含集合名称和别名。

在您的示例中,Families 充当集合名称,f 充当别名。如果您正在针对单个集合创建查询(这是最常见的情况),您实际上不需要指定集合名称,您可以简单地使用对集合内容(文档)的引用,如下所示:

SELECT * FROM f WHERE f.id = "AndersenFamily"

我的观点是,Families 引用是为了让来自 SQL 场景的人可以与查询结构相关(看起来像引用表)。

【讨论】:

    猜你喜欢
    • 2016-09-03
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多