我有以下使用 .NET MongoDb 驱动程序的 C# 函数,目前运行良好。 它排除了使用投影的所有查询返回的 RedactedPropertyList 集合中的某些字段。 但是,我现在需要将排除字段的/长度/包含为新字段,并且我正在努力使其工作
private ProjectionDefinition<BsonDocument> GetFullRedactionProjection()
{
var exclusions =
RedactedPropertyList.Aggregate<string?, ProjectionDefinition<BsonDocument>?>(null,
(current, item) =>
current == null ? Builders<BsonDocument>.Projection.Exclude(item) : current.Exclude(item));
return exclusions!;
}
有什么建议吗?
您可以应用
$set
阶段并将编辑属性的值更改为其大小来代替实际内容,而不是使用投影。在普通 JSON 中,此阶段如下所示(对于已编辑的属性 A 和 B):
{
"$set": {
"A": {
"$size": "$A"
},
"B": {
"$size": "$B"
}
}
}
当您使用
BsonDocument
对象时,实现此目的的一个简单方法是将舞台构建为 BsonDocument
并将其附加到管道,如以下示例所示:
var collDoc = db.GetCollection<BsonDocument>("docs");
List<string> RedactedPropertyList = ["A", "B"];
List<BsonElement> assignments = RedactedPropertyList
.Select(prop => new BsonElement(prop, new BsonDocument() { { "$size", "$" + prop } }))
.ToList();
var setStage = new BsonDocument()
{
{"$set", new BsonDocument(assignments) }
};
PipelineDefinition<BsonDocument, BsonDocument> pipeline =
new EmptyPipelineDefinition<BsonDocument>();
// Add other stages as required
pipeline = pipeline.AppendStage<BsonDocument, BsonDocument, BsonDocument>(setStage);
var result = await collDoc.AggregateAsync(pipeline);
上面的示例基本上用各自的长度覆盖现有属性。这样就无需使用
$project
阶段排除属性。$set
阶段,然后添加另一个排除原始文档的投影阶段。