【问题标题】:Delete duplicate documents from DocumentDB从 DocumentDB 中删除重复的文档
【发布时间】:2017-07-09 14:46:35
【问题描述】:

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

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

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

集合中有很多这样的重复文档。批量生产的有效方法是什么?

【问题讨论】:

    标签: azure-cosmosdb


    【解决方案1】:

    您似乎想对数据进行分组并从每个组中删除重复项(具有相同 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
    

    【讨论】:

    • @Alvin PL 有什么更新吗?您现在可以删除重复项了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多