考虑以下文档类型
class Info
{
public string Id { get; set; }
public string UserId { get; set; } // used as partition key
public DateTime CreatedAt { get; set; }
}
我已经用这个创建了一个收藏
var bson = new BsonDocument
{
{ "shardCollection", "mydb.userInfo" },
{ "key", new BsonDocument(shardKey, "hashed") }
};
database.RunCommand(new BsonDocumentCommand<BsonDocument>(bson));
要删除所有早于特定日期的文档,我尝试过
collection.DeleteManyAsync(t => t.CreatedAt >= date);
但是这以Command delete failed: query in command must target a single shard key.
失败了,我的问题是,如何有效地在多个分区中删除这些文档?在这种情况下,我不是在寻找如何选择分区键的答案。我认为在某些情况下,我不得不在所有分区上运行修改查询。
我可以先使用collection.Find(t => t.CreatedAt >= date)
查询文档,然后为每组分区键运行一个DeleteManyAsync(t => idsInThatPartition.Contains(t.Id) && t.UserId == thatPartitionKey)
,但是我真的希望有更好的方法。示例代码:
var affectedPartitions = await collection.Aggregate()
.Match(i => i.CreatedAt >= date)
.Group(i => i.UserId, group => new { Key = group.Key })
.ToListAsync();
foreach (var partition in affectedPartitions)
{
await collection.DeleteManyAsync(
i => i.CreatedAt >= date && i.UserId == partition.Key);
}
答案 0 :(得分:0)
我遇到了同样的问题,最终发现这目前尚不可能,并且Azure CosmosDb团队正在研究一种解决方案,并计划于2019年第一个月发布
等待并查看:(
答案 1 :(得分:0)
我不了解特定于C#的语法,但是我设法通过MongoDB批量操作解决了此问题。
这个解决方案远非完美,但是我想解决这个问题的唯一方法。
这是我如何在Node.js上实现此示例:
//First find all your document you want to Update/Delete
const res = await model.find(query).lean().exec()
//Initialize bulk operation object
var bulk = model.collection.initializeUnorderedBulkOp();
//Iterate the results
res.forEach((item: any) => {
//Find your document with your shared key ( my shared key is the document _id)
bulk.find({ _id: item._id }).removeOne();
})
//Check if should excute the bulk operation
if (bulk.length > 0)
//Execute all operations at once
return await bulk.execute();
参考MongoDB批量操作https://docs.mongodb.com/manual/reference/method/Bulk/