如何在DocumentDB中查找文档,其中属性(对象数组)包含具有给定条件的对象

时间:2016-04-17 09:05:42

标签: azure-cosmosdb

我想查询Microsoft Azure DocumentDB集合以获取所有"数组" property(在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.

Google搜索&#34; documentdb linq&#34;引导我访问此博文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);

有效!好的,支持count但只支持没有谓词的原始计数。

下一步该怎么做?任何人都可以告诉我如何查询DocumentDB以获得我想要的东西吗?

1 个答案:

答案 0 :(得分:2)

我认为你要找的是这样的:

_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));

希望这会有所帮助。