[英]What would be the MongoDB C# driver equivalent of the following query using the array update operator $[<identifier>]
來自https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/#up。 S [%3Cidentifier%3E]
鑒於以下集合
{
"_id" : 1,
"grades" : [
{ "grade" : 80, "mean" : 75, "std" : 6 },
{ "grade" : 85, "mean" : 90, "std" : 4 },
{ "grade" : 85, "mean" : 85, "std" : 6 }
]
}
{
"_id" : 2,
"grades" : [
{ "grade" : 90, "mean" : 75, "std" : 6 },
{ "grade" : 87, "mean" : 90, "std" : 3 },
{ "grade" : 85, "mean" : 85, "std" : 4 }
]
}
並查詢
db.students2.update(
{ },
{ $set: { "grades.$[elem].mean" : 100 } },
{
multi: true,
arrayFilters: [ { "elem.grade": { $gte: 85 } } ]
}
)
我將如何使用 C# 驅動程序執行相同的查詢? 目前我只是使用db.RunCommand
對數據庫運行查詢,因為我看不到使用當前驅動程序將其轉換為 C# 的方法。
您可以在C#以下嘗試使用BsonDocument
和json字符串選項。 沒有linq選項。
var filter = Builders<BsonDocument>.Filter.Empty;
var update = Builders<BsonDocument>.Update.Set("grades.$[elem].mean", 100);
var arrayFilter = new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("elem.grade", new BsonDocument("$gte", 85)));
var arrayFilter = new JsonArrayFilterDefinition<BsonDocument>("{ \"elem.grade\": { $gte: 85 } }");
var arrayFilters = new List<ArrayFilterDefinition> { arrayFilter };
var updateOptions = new UpdateOptions();
updateOptions.ArrayFilters = arrayFilters;
var result = collection.UpdateOne(filter, update, updateOptions);
使用允許使用Linq3 provider
和AllMatchingElements
方法的驅動程序 2.17.1 :
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
var settings = MongoClientSettings.FromConnectionString("mongodb://localhost:27017/");
settings.LinqProvider = LinqProvider.V3; // important!! works with <PackageReference Include="MongoDB.Driver" Version="2.17.1" />
var collection = new MongoClient(settings).GetDatabase("test").GetCollection<GradesDocument>("GradesCollection");
collection.InsertMany(new List<GradesDocument>
{
new (1, new List<GradeRecord>
{
new (80,75,6),
new (85,90,4),
new (85,85,6),
}),
new (2, new List<GradeRecord>
{
new (90,75,6),
new (87,90,3),
new (85,85,4),
}),
});
var identifier = "whatever";
var filter = Builders<GradesDocument>.Filter.Empty;
var update = Builders<GradesDocument>.Update.Set(a => a.Grades.AllMatchingElements(identifier).Mean, 100);
var arrayFilter = new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument($"{identifier}.{nameof(GradeRecord.Grade)}", new BsonDocument("$gte", 85)));
var arrayFilters = new List<ArrayFilterDefinition> { arrayFilter };
var updateOptions = new UpdateOptions
{
ArrayFilters = arrayFilters
};
var result = collection.UpdateMany(filter, update, updateOptions);
public record GradesDocument(int Id, List<GradeRecord> Grades);
public record GradeRecord(int Grade, int Mean, int Std);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.