从DocumentDB中删除重复的文档

时间:2017-07-09 14:46:35

标签: azure-cosmosdb

如何根据文档属性值删除重复文档?例如,集合中的文档如下所示

    [  {
    "ProductIdentifier": "A100",
    "ProductTitle": "Product A",
    "_ts": 1491664477
  },
  {
    "ProductIdentifier": "A100",
    "ProductTitle": "Product A"
    "_ts": 1491664466
  }
  {
    "ProductIdentifier": "B100",
    "ProductTitle": "Product B"
    "_ts": 1491664477
  }
]

我想删除第二个文档,因为它与第一个文档相同(基于ProductIdentifier)并且具有较低的时间戳(基于_ts)

集合中有很多这样的重复文档。批量执行此操作的有效方法是什么?

1 个答案:

答案 0 :(得分:0)

您似乎希望对数据进行分组并从每个组中删除重复项(具有相同的ProductIdentifier值和较低的时间戳)。据我所知,目前GroupBy does not be supported in DocumentDB。但是您可以对数据进行分组并通过LINQ从每个组中获取ProductIdentifier,然后使用相同的ProductIdentifier查询文档并删除重复项。

var query = client.CreateDocumentQuery<MyDoc>(UriFactory.CreateDocumentCollectionUri("testdb", "testcoll")).Where(d => d.ProductIdentifier != "");

List<MyDoc> list1 = query.ToList();

var result = list1.GroupBy(item => new
{
    ProductIdentifier = item.ProductIdentifier,
    ProductTitle = item.ProductTitle
})
.Select(group => new
{
    ProductIdentifier = group.Key.ProductIdentifier,
    ProductTitle = group.Key.ProductTitle
});

foreach (var item in result)
{
    var query1 = client.CreateDocumentQuery<MyDoc>(UriFactory.CreateDocumentCollectionUri("testdb", "testcoll")).Where(d => d.ProductIdentifier == item.ProductIdentifier && d.ProductTitle == item.ProductTitle);

    if (query1.Count() > 1)
    {
       //delete duplicates from a group
    }

}

此外,正如Larry Maccherone在this thread中所说,documentdb-lumenize是DocumentDB的聚合库,它是一个存储过程,可以帮助我们执行GroupBy。

string configString = @"{
    cubeConfig: {
        groupBy: 'ProductIdentifier', 
        field: '_ts', 
        f: 'max'
    }, 
    filterQuery: 'SELECT * FROM c'
}";
Object config = JsonConvert.DeserializeObject<Object>(configString);
dynamic result = await client.ExecuteStoredProcedureAsync<dynamic>(UriFactory.CreateStoredProcedureUri("testdb", "testcoll", "cube"), config);
//get group info form result.Response