如何根据文档属性值删除重复文档?例如,集合中的文档如下所示
[ {
"ProductIdentifier": "A100",
"ProductTitle": "Product A",
"_ts": 1491664477
},
{
"ProductIdentifier": "A100",
"ProductTitle": "Product A"
"_ts": 1491664466
}
{
"ProductIdentifier": "B100",
"ProductTitle": "Product B"
"_ts": 1491664477
}
]
我想删除第二个文档,因为它与第一个文档相同(基于ProductIdentifier)并且具有较低的时间戳(基于_ts)
集合中有很多这样的重复文档。批量执行此操作的有效方法是什么?
答案 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