我试图通过MongoDB的C#驱动程序在文档数组中嵌入文档 . 我设法通过$ set和arrayFilters修改现有的数组元素,但很难通过$ addToSet添加不存在的元素 . 即使有完全不同的方式,我也会对任何建议感到高兴 .

我在C#中的简化课程

internal class TimeSeries
{
    [BsonId]
    internal Name;

    [BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)]
    internal Dictionary<DateTime, double> Container;
}

// add a test document
void foo()
{
    var coll = _myDatabase.GetCollection<TimeSeries>("myColl"); 
    var res = coll.InsertOne(new TimeSeries() 
        { Name = "abc", Container = new Dictionary<DateTime, double>() 
            {{new DateTime(2000,1,1),20}}
        });
}

Mongo Shell中的$ set和$ addToSet工作正常:

// modify the existing value to 30
db.myColl.update( {"_id":"abc"}, {$set: {"Container.$[loc].v":30}}, {arrayFilters:[{"loc.k":new Date("2000-01-01")}]})

// add if no existent
db.myColl.update( {"_id":"abc"}, {$addToSet: {"Container": {"k":new Date("2000-02-01"),"v":200}}})

在C#中,我可以重现$ set,但是为$ addToSet获取“特定的转换无效”错误 .

var filter = Builders<TimeSeries>.Filter.Eq("_id", "abc");

var arrayFilters = new List<ArrayFilterDefinition<BsonDocument>>()
                    {new BsonDocument("loc.k", new DateTime(2000,1,1))}; 

// $set
var upsert = Builders<TimeSeries>.Update.Set("Container.$[loc].v", 30);
var resUpt = coll.UpdateOne(filter, upsert, new UpdateOptions { ArrayFilters = arrayFilters })

// $addToSet
var upsert_add = Builders<TimeSeries>.Update.AddToSet("Container", new BsonDocument { { "k", new DateTime(2000, 2, 1) }, { "v", 50} });
var res_add = coll.UpdateOne(filter, upsert_add); // Specific Cast is not valid