簡體   English   中英

使用數組更新運算符 $[<identifier> ]</identifier>

[英]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 providerAllMatchingElements方法的驅動程序 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM