【问题标题】:How to find documents in DocumentDB where a property (array of objects) contains an object with a given criteria如何在 DocumentDB 中查找属性(对象数组)包含具有给定条件的对象的文档
【发布时间】:2016-04-18 09:21:47
【问题描述】:

我想查询 Microsoft Azure DocumentDB 集合以获取其“数组”属性(在 JSON 语音中)包含与给定过滤条件匹配的对象的所有文档。

这是我的文件:

public class CouponReadModel
{
    public List<Models.BookEntry> BookEntries { get; set; }
    // some other properties

    public class Models
    {
        public class BookEntry
        {
            public Guid OrderId { get; set; }
            // some other properties
        }        
    }
}

首先我尝试使用 ANY(在这种情况下,TReadModel 是 CouponReadModel)

_documentClient
  .CreateDocumentQuery<TReadModel>(_documentCollectionUri)
  .Where(coupon => coupon.BookEntries.Any(be => be.OrderId == someOrderId));

我刚刚得到以下异常:

Exception thrown: 'Microsoft.Azure.Documents.Linq.DocumentQueryException' in mscorlib.dll
Additional information: Method 'Any' is not supported.

谷歌搜索“documentdb linq”将我带到这篇博文this。 伟大的!我对自己说没问题!该帖子告诉我,数组支持 LINQ 运算符计数(我的 BookEntries 集合?!)。第二次尝试!

_documentClient
  .CreateDocumentQuery<TReadModel>(_documentCollectionUri)
  .Where(coupon => coupon.BookEntries.Count(be => be.OrderId == someOrderId) > 0);

我遇到了另一个例外:

Exception thrown: 'Microsoft.Azure.Documents.Linq.DocumentQueryException' in mscorlib.dll
Additional information: Method 'Count' is not supported.

不支持计数?再试一次:

_documentClient
  .CreateDocumentQuery<TReadModel>(_documentCollectionUri)
  .Where(coupon => coupon.BookEntries.Count() > 0);

有效!好的,支持计数,但仅支持不带谓词的原始计数。

接下来要做什么?谁能告诉我如何查询 DocumentDB 以获得我想要的?

【问题讨论】:

  • 我删掉了语言的不那么有趣的用法。让我们在这里保持成熟,好吗?

标签: azure-cosmosdb


【解决方案1】:

我认为您正在寻找的是这样的:

_documentClient
 .CreateDocumentQuery<TReadModel>(_documentCollectionUri)
 .Select(coupon => coupon)                           
 .SelectMany(coupon => coupon.BookEntries
 .Where(bookEntries => bookEntries.OrderId == someOrderId)
 .Select(bookEntries => new
  {
    coupon = coupon
  }));

这将返回一个匿名类型,该类型基本上是父文档 (TReadModel),并将包含 BookEntries 数组。

如果您只查找与搜索条件匹配的任何 BookEntry,而不是包含该 BookEntry 的父文档,则将查询更改为:

_documentClient
 .CreateDocumentQuery<TReadModel>(_documentCollectionUri)                         
 .SelectMany(coupon => coupon.BookEntries
 .Where(bookEntries => bookEntries.OrderId == someOrderId)
 .Select(bookEntries => bookEntries));

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2013-02-13
    • 2023-03-26
    • 2014-11-22
    • 2021-12-26
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多