J'ai une base de données Cosmos et je souhaite y écrire différents types de documents. La structure des documents est dynamique et peut changer.

J'ai essayé ce qui suit. Disons que j'ai la classe suivante :

class CosmosDbItem implements Serializable {
    private final String _id;
    private final String _payload;

    public CosmosDbItem(String id, String payload) {
      _id = id;
      _payload = payload;
    }

    public String getId() {
      return _id;
    }

    public String getPayload() {
      return _payload;
    }
  }

Je peux ensuite créer le document avec du JSON comme suit :

CosmosContainer _container = ...
CosmosDbItem dataToWrite = new CosmosDbItem("what-ever-id-18357", "{\"name\":\"Jane Doe\", \"age\":42}")
item = _cosmosContainer.createItem(dataToWrite, partitionKey, cosmosItemRequestOptions);

Cela donne un document comme celui-ci :

{
    "id": "what-ever-id-18357",
    "payload": "{\"name\":\"Jane Doe\", \"age\":42}",
    "_rid": "aaaaaaDaaAAAAAAAAAA==",
    "_self": "dbs/aaaaAA==/colls/aaaaAaaaDI=/docs/aaaaapaaaaaAAAAAAAAAA==/",
    "_etag": "\"6e00c443-0000-0700-0000-5f8499a70000\"",
    "_attachments": "attachments/",
    "_ts": 1602525607
}

Existe-t-il un moyen de générer la charge utile en tant qu'objet JSON réel dans ce document ? Que dois-je changer dans ma classe CosmosDbItem ? Comme ça:

{
    "id": "what-ever-id-18357",
    "payload": {
                 "name":"Jane Doe",
                 "age":42
               },
    "_rid": "aaaaaaDaaAAAAAAAAAA==",
    "_self": "dbs/aaaaAA==/colls/aaaaAaaaDI=/docs/aaaaapaaaaaAAAAAAAAAA==/",
    "_etag": "\"6e00c443-0000-0700-0000-5f8499a70000\"",
    "_attachments": "attachments/",
    "_ts": 1602525607
}
0
jmizv 13 oct. 2020 à 11:53

1 réponse

Meilleure réponse

Voici ma solution que j'ai fini. En fait, c'est assez simple une fois que je suis derrière. Au lieu d'utiliser CosmosDbItem, j'utilise un simple HashMap<String, Object>.

public void writeData() {
    ...
    Map<String, Object> stringObjectMap = buildDocumentMap("the-id-", "{\"key\":\"vale\"}");
    _cosmosContainer.createItem(stringObjectMap, partitionKey, cosmosItemRequestOptions);
    ...
  }
  
  public Map<String, Object> buildDocumentMap(String id, String jsonToUse) {
    JSONObject jsonObject = new JSONObject(jsonToUse);
    jsonObject.put("id", id);
    return jsonObject.toMap();
  }

Cela peut produire le document suivant :

{
    "key": "value",
    "id": "the-id-",
    "_rid": "eaaaaaaaaaaaAAAAAAAAAA==",
    "_self": "dbs/eaaaAA==/colls/eaaaaaaaaaM=/docs/eaaaaaaaaaaaaaAAAAAAAA==/",
    "_etag": "\"3b0063ea-0000-0700-0000-5f804b3d0000\"",
    "_attachments": "attachments/",
    "_ts": 1602243389
}

Une remarque : il est important de définir la clé id dans le HashMap. Sinon on obtiendra l'erreur

"The input content is invalid because the required properties - 'id; ' - are missing"
0
jmizv 13 oct. 2020 à 13:51