如何创建投影以排除某些字段,但包括它们的长度?

问题描述 投票:0回答:1

我有以下使用 .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!;
}

有什么建议吗?

c# mongodb mongodb-query mongodb-.net-driver
1个回答
0
投票

您可以应用

$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
阶段,然后添加另一个排除原始文档的投影阶段。

© www.soinside.com 2019 - 2024. All rights reserved.