2017-10-06 1 views
1

Ich habe ein Datenmodell, das so etwas wie folgt strukturiert ist:Kann ich in ein verschachteltes Array wechseln, ohne zu wissen, ob dieses Array bereits existiert?

{ 
    "_id": "1234abcd", 
    "name": "The Stanley Parable" 
    "notes": [ 
     { 
      "_id": "5678efgh", 
      "content": "Kind of a walking simulator." 
     }, 
        { 
      "_id": "5678efgh", 
      "content": "Super trippy." 
     }, 
    ] 
} 

Ich verwende die Mongo-Treiber für C# mit diesem Modell in .NET-Core zu interagieren. Ich versuche, einem bestimmten Spiel eine neue Notiz hinzuzufügen - ohne unbedingt sicher zu sein, dass es bereits Notizen zu diesem Spiel gibt. Dies ist, was ich in der Lage gewesen, für das Hinzufügen einer verschachtelte Liste zu finden:

var filter = Builders<Mongo_VideoGame>.Filter.Eq("Id", id); 
var update = Builders<Mongo_VideoGame>.Update.Push<Mongo_Note>(v => v.Notes, mongoNote); 

var editedGame = _context.VideoGames.FindOneAndUpdate(filter, update); 

Aber mein Problem ist, dass dies nur funktioniert, wenn es bereits ein „Notizen“ Element auf das Spielmodell. Ich könnte einfach ein leeres Array hinzufügen, wenn ich das ursprüngliche Spiel mache, aber das scheint weniger flexibel zu sein, das Schema zu ändern (d. H. Was, wenn ich Notizen zu bestehenden Daten hinzufüge).

An exception of type 'MongoDB.Driver.MongoCommandException' occurred in MongoDB.Driver.Core.dll but was not handled in user code: 'Command findAndModify failed: The field 'notes' must be an array but is of type null in document'

Antwort

1

So landete ich diese eine Lösung zu finden auf.

Zunächst funktioniert .Push() funktioniert so, wie ich ursprünglich erwartet hatte. Es wird erstellen ein Array, wenn nicht bereits existiert.

Mein tatsächliches Problem hatte mit dem C# -Modell zu tun, das ich benutzte. Bisher:

public class Mongo_VideoGame 
{ 
    [BsonId] 
    [BsonRepresentation(BsonType.ObjectId)] 
    public string Id { get; set; } 

    [BsonElement("name")] 
    public string Name { get; set; } 

    [BsonElement("notes")] 
    public List<Mongo_Note> Notes { get; set; } 

} 

Aber da gibt es keine Hinweise auf dem Dokument wurde gefunden, ich war im Grunde in eine null Notizen Array einfügen wollen. Um dies zu beheben, setze ich den Standardwert für Notes so, dass es hineingeschoben werden könnte. Wie folgt aus:

public class Mongo_VideoGame 
{ 
    [BsonId] 
    [BsonRepresentation(BsonType.ObjectId)] 
    public string Id { get; set; } 

    [BsonElement("name")] 
    public string Name { get; set; } 

    [BsonElement("notes")] 
    public List<Mongo_Note> Notes { get; set; } = new List<Mongo_Note>(); 

} 

Sowohl der Fall der Zugabe zu einem vorhandenen Array und die Schaffung der Array, wenn es keine Arbeit jetzt existiert.

+0

Wenn Sie den Speicher definieren, wird der Speicher nicht wie von Ihnen ermittelt zugewiesen. Bei Verwendung eines DI-Containers müsste die verdrahtete neue Liste verschoben werden. Vielleicht ist der Konstruktor als konstruktorbasierte Injektion ziemlich üblich. –

Verwandte Themen