MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb C#-Treiberaktualisierung aller Subarray-Elemente fehlgeschlagen, wenn Array leer ist

Wie die Fehlermeldung sagt, dürfen Sie Array-Aktualisierungsvorgänge nur für ein Feld ausführen, das ein Array ist. wenn das Feld einen Wert von null hat oder nicht vorhanden ist, schlägt auch das Update fehl.

Die einfachste Lösung besteht darin, das Feld beim Speichern der Dokumente zu einem leeren Array zu machen, sodass es in der db so aussieht:

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

Dies kann leicht erreicht werden, indem Sie Ihrer C#-Eigenschaft einen Standardwert wie diesen geben:

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

Testprogramm:

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();
        }
    }
}