$unset 二维数组 MongoDB (C#)

$unset 2D array MongoDB (C#)

早上好,

我有一个关于 MongoDb 的问题,我正在尝试取消设置“引用”的索引,在我的 Json 上,您可以看到 1 个字段引用和 2 个引用:“Saisir ou Selection une citations”和“XD”,我想取消设置 XD,我该如何实现?

{ 
"_id" : ObjectId("604ca13de0059b65e4e67c01"), 
"username" : "LOL", 
"pass" : "LOL", 
"citations" : [
    [
        {
            "body" : "Saisir ou Selection une citations", 
            "author" : "author", 
            "oeuvre" : "oeuvre", 
            "annee" : NumberInt(1)
        }
    ], 
    [
        {
            "body" : "XD", 
            "author" : "XD", 
            "oeuvre" : "XD", 
            "annee" : NumberInt(3)
        }
    ]
]

}

我试过很多东西:

db.getCollection("Users").update(
{}, {$unset : {"citations.$.body" : "XD"}}
)

我尝试了许多其他变体,但没有找到正确的解决方案。

PS :

我正在开发一个 C# Wpf 应用程序,如果你能在这种语言上帮助我,那将是完美的,但不用担心,它并没有太大的不同

在更新函数中你需要给出第一个条件。您可能需要使用“$pull”从数组中删除值。

应该是这样的:

    db.getCollection("Users").update(
      {citations.body: "XD"}, {$pull : {"citations.$.body" : "XD"}}
    )

您将不得不使用 c# 驱动程序中的 ElemMatchPullFilter 运算符来实现您的目标,如下所示:

var filter = Builders<User>.Filter.ElemMatch(
    u => u.Citations, 
    c => c.Body == "XD");

var update = Builders<User>.Update.PullFilter(
    u => u.Citations,
    c => c.Body == "XD");

await userCollection.UpdateManyAsync(filter, update);

这是使用 MongoDB.Entities 库(我写的)做同样事情的另一种不那么冗长的方法:

using MongoDB.Entities;
using System.Linq;
using System.Threading.Tasks;

namespace TestApplication
{
    public class User : Entity
    {
        public Citation[] Citations { get; set; }
    }

    public class Citation
    {
        public string Body { get; set; }
    }

    public static class Program
    {
        private static async Task Main()
        {
            await DB.InitAsync("test");

            await new[] {
                new User {
                    Citations = new[]
                    {
                        new Citation { Body = "Saisir ou Selection une citations"},
                        new Citation { Body = "XD"},
                    }
                },
                new User {
                    Citations = new[]
                    {
                        new Citation { Body = "Saisir ou Selection une citations"},
                        new Citation { Body = "XD"},
                    }
                }
            }.SaveAsync();

            await DB.Update<User>()
                    .Match(u => u.Citations.Any(c => c.Body == "XD"))
                    .Modify(f => f.PullFilter(u => u.Citations, c => c.Body == "XD"))
                    .ExecuteAsync();
        }
    }
}