sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongodb C# driveropdatering af alle subarray-elementer mislykkedes, når arrayet er tomt

som fejlmeddelelsen siger, har du kun tilladelse til at køre array-opdateringsoperationer på et felt, der er et array. hvis feltet har værdien null eller ikke eksisterer, vil opdateringen også mislykkes.

den enkleste løsning er at gøre feltet til et tomt array, når du gemmer dokumenterne, så det ser sådan ud i db:

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

hvilket nemt kan opnås ved at give din c#-egenskab en standardværdi som sådan:

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

testprogram:

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



  1. 5 måder at vælge rækker med minimumsværdien for deres gruppe i SQL

  2. Oprettelse af en nummereret liste for meteordata

  3. Sammenlægning af to samlinger i MongoDB

  4. Hvordan fortæller du Mongo om at sortere en samling, før du begrænser resultaterne?