2014-08-27 6 views
5

Sto provando a scrivere un controller Web Api per scopi generici che mi consenta di salvare un documento JSON in una raccolta SENZA specificare un tipo C#. Ho cercato di condensare il codice verso il basso per l'essenziale:MongoDB C# - come salvare un documento JSON arbitrario come tipo dinamico?

public class PassThroughController : ApiController 
{ 
    [Route("api/mongodb/{collection}")] 
    public void Post(string collection, dynamic document) 
    { 
     const string connectionString = "mongodb://localhost"; 

     var client = new MongoClient(connectionString); 
     var db = client.GetServer().GetDatabase("SampleDb"); 
     var mongoCollection = db.GetCollection(collection); 

     mongoCollection.Save(document, 
      new MongoInsertOptions 
      { 
       WriteConcern = WriteConcern.Acknowledged 
      }); 
     } 
} 

Sto cercando di inviare un documento semplice:

{ id: "2112", name: "Rush" } 

Ma non importa quale mando al metodo, ottengo un errore simile a questo: "Salva può essere utilizzato solo con documenti che hanno un ID".

Abbiamo tentato un numero di proprietà diverse per Id (Id, id, _id) ma tutte hanno come risultato un problema simile.

Qualche idea?

Grazie

risposta

10

Con l'aiuto di un collega di lavoro, ho capito una soluzione:

public class PassThroughController : ApiController 
{ 
    [Route("api/mongodb/{collection}")] 
    public void Post(string collection, HttpRequestMessage message) 
    { 
     const string connectionString = "mongodb://localhost"; 

     var client = new MongoClient(connectionString); 
     var db = client.GetServer().GetDatabase("SampleDb"); 
     var mongoCollection = db.GetCollection(collection); 

     var json = message.Content.ReadAsStringAsync().Result; 
     var document = BsonSerializer.Deserialize<BsonDocument>(json); 

     mongoCollection.Save(document, 
      new MongoInsertOptions 
      { 
       WriteConcern = WriteConcern.Acknowledged 
      }); 
     } 
} 
0

Stavo cercando di risparmiare un po 'oggetto dinamico associato ad una ProcessID, l'oggetto dinamico è del tutto " dinamico ", a volte può essere una proprietà con alcuni dati e nomi arbitrari, a volte può essere un 100 proprietà con nomi totalmente arbitrari per ogni proprietà. Infatti, è un oggetto proveniente da un'app Angular 5 che genera una forma dinamica da (sorpresa) alcuni oggetti JSON. La mia classe "base", quello che vengono inseriti in Mongo è come questo:

public class MongoSave { 

    [BsonId(IdGenerator = typeof(StringObjectIdGenerator))] 
    public string Id { get; set; }   
    public int ProcessID { get; set; } 
    public BsonDocument DynamicData { get; set; } 

} 

Al mio primo tentativo la proprietà DynamicData era tipo object, il metodo di controllo ha ricevuto tutto ok, assegnare l'oggetto in ingresso alla classe, ma quando si salva l'oggetto su mongo, i valori per DynamicData sono andati persi. Stavo ricevendo solo i nomi delle proprietà. Ho cercato di usare l'annotazione BsonSerialize nella mia classe ma senza successo.

Ricercando un po 'ho scoperto che BsonDocument ha un metodo simile a Parse javascript che analizzare una stringa contenente una descrizione dell'oggetto, quindi ... ho postato un oggetto come questo per il mio controller:

{ 
    "ProcessID": 987, 
    "DynamicData": { 
     "name": "Daniel", 
     "lastName": "Díaz", 
     "employeeID": 654 
    } 
{ 

A poche cose qui, sto inviando tramite Insomnia (un'alternativa Postman) questo JSON all'API. Nel mondo reale invierò questo oggetto via Angular quindi devo assicurarmi di applicare JSON.stringify(obj) per assicurarmi che l'oggetto JSON sia corretto (non so con certezza se gli oggetti Angular HttpClient post come JSON o come oggetti JS con stringhe (io ti test) ha cambiato la mia azione di controllo per utilizzare il metodo Parse e la DynamicData C# generici object a stringa in questo modo:.

[HttpPost("~/api/mongotest/save")] 
public async Task<IActionResult> PostObjectToMongo (MongoSaveDTO document) { 

    MongoSave mongoItem = new MongoSave() { 
     ProcessID = document.ProcessID, 
     DynamicData = BsonDocument.Parse(document.DynamicData.ToString()) 
    }; 

    await _mongoRepo.AddMongoSave(mongoItem); 

    return Ok(); 
} 

il MongoSaveDTO è la stessa come MongoSave senza la proprietà BsonId invece di BsonDocument sto usando il tipo C# object generico e tutto si conserva come un fascino

Problemi correlati