Is there a way to include the field in the get call?

I am trying to get the field in the json response object in the collection.get(<docId>) call. This might sound strange because for performing a get call one should already have the id value so why need it in the response, right? here is the thing :

in kotlin, there is the concept of data class used for representing DTO object where all the fields should be available at construction time*. Having id field in the response simplifies the whole deserialization process and we can simply do collection.get(<docId>).contentAs( and I am good.

If we don’t have the id field in the response, to be able to build the DTO there might be a way to do custom transcoding or custom deserialization but that seems like an overkill for such a simple need. Other option is to use N1QL query to fetch a document but going via query service for fetching a document for which the id is available seems unnecessary and i feel that using couchbase like a key value store for these kind of use cases is the best way.

So, is there a way to include id field in the json object? are there any simpler neater alternatives to do that? should we store an id field in the user content area as well to solve this?

*There is a way to add properties after construction, but by doing that, the benefits of data class will be lost and a custom hashcode(), equals() etc. methods need to be implemented,

1 Like

wanted to follow up on this since i haven’t heard from any Couchbase Java SDK experts.

Does the use case seem valid? is the explanation unclear or does it lack any information that you guys need?

kindly let me know.

There isn’t a way to cause the to be added to the document returned explicitly. Keep in mind, the IS the key, which is what you are using to perform the get() operation. Therefore, you could convert the domain object using result.contentAs() and then manually set the property as the key. I think that’s what you are referring to in your original question. Also, the key is often a composite of elements in the document itself. If that is the case, you can simply add a getter of some sort to compose the key.

If you absolutely need the return value to be one document, you could consider using a N1QL query using the USE KEYS element. This does not require creation of an index and functions much like a get call. If you wanted it all in one composite document returned, try some thing like this:
select meta().id, myBucket.* from myBucket USE KEYS '234567'

This will return a document looking like:
“id”: 234567,
… the other elements of your document

1 Like