MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

La mise à jour du pilote Mongodb C# de tous les éléments du sous-tableau a échoué lorsque le tableau est vide

comme le message d'erreur l'indique, vous n'êtes autorisé à exécuter des opérations de mise à jour de tableau que sur un champ qui est un tableau. si le champ a une valeur de null ou n'existe pas, la mise à jour échouera également.

la solution la plus simple consiste à faire du champ un tableau vide lors de l'enregistrement des documents afin qu'il ressemble à ceci dans la base de données :

{
    "_id": ObjectId("5df9af0e22bb051d0c25c936"),
    "Quotes": [ ]
}

ce qui peut être facilement réalisé en donnant à votre propriété c# une valeur par défaut comme ceci :

    public Quote[] Quotes { get; set; } = new Quote[0];

programme de test :

using MongoDB.Entities;
using MongoDB.Entities.Core;

namespace StackOverflow
{
    public class Test : Entity
    {
        public string Name { get; set; }
        public Quote[] Quotes { get; set; } = new Quote[0];
    }

    public class Quote
    {
        public bool flag { get; set; }
        public string status { get; set; }
    }

    public class Program
    {
        private static void Main(string[] args)
        {
            new DB("test", "localhost");

            (new[] {
                new Test { Name = "no quotes"},
                new Test { Quotes = new[]{
                    new Quote { flag = true, status = "PROCESSED" } } },

                new Test { Quotes = new[]{
                    new Quote { flag = true, status = "NOT-PROCESSED" },
                    new Quote { flag = true, status = "NOT-PROCESSED" }
                }}
            }).Save();

            var field = Prop.PosAll<Test>(t => t.Quotes[0].flag);

            DB.Update<Test>()
              .Match(_ => true)
              .Modify(b => b.Set(field, false))
              .Execute();
        }
    }
}