等效于 C# 驱动程序中的 SetUnion

Equivalent for SetUnion in C# driver

我在 mongodb 文档中有一个包含数字数组的字段。我想用新收到的号码更新此字段。但只有当数组中不存在数字时,我才需要添加数字。在 MongoDB 中,我们可以使用 $setUnion 但我不确定在 C# 驱动程序端。任何人请提出解决方案。

$setUnion用于产生聚合输出。

您需要使用来自 c# 驱动程序的 AddToSetEach

请在插入后找到带有检查的完整代码片段

public static void Main()
    {
        var client = new MongoClient("mongodb://localhost:27017");
        var database = client.GetDatabase("test");

        var collection = database.GetCollection<KalaimaniData>("kalaimani");

        // create array to inser
        var arrayToInsert = new[] { 1, 4, 5, 6 };
        var arrayToMerge = new[] { 2, 3, 4, 5 };
        var arrayExpected = new[] { 1, 4, 5, 6, 2, 3 };

        var doc = new KalaimaniData { Numbers = arrayToInsert };

        collection.InsertOne(doc);

        var filter = Builders<KalaimaniData>.Filter.Eq(x => x.Id, doc.Id);

        var updateDef = new UpdateDefinitionBuilder<KalaimaniData>().AddToSetEach(x => x.Numbers, arrayToMerge);

        collection.UpdateOne(filter, updateDef);

        // retrive and compare
        var changed = collection.Find(filter).First();

        var matched = 0;
        foreach (var element in arrayExpected)
        {
            if (changed.Numbers.Contains(element))
            {
                matched++;
            }
        }

        if (changed.Numbers.Length == matched)
        {
            Console.WriteLine("OK");
        }
        else
        {
            Console.WriteLine("NOK");
        }

        Console.ReadLine();
    }

    /// <summary>TODO The kalaimani data.</summary>
    class KalaimaniData
    {
        /// <summary>Gets or sets the id.</summary>
        public ObjectId Id { get; set; }

        /// <summary>Gets or sets the numbers.</summary>
        public int[] Numbers { get; set; }
    }