Problem: I am trying to built a utility project using .net sdk to update a specific field in all my couchbase documents of a specific doctype. i dont want to upsert but instead i want to update. is there any function in .net sdk which i can use to update the specific field.
Note: I dont want to use N1QL query since im updating the time field in all the documents which by query is not giving the precision i want which is upto micro seconds. for example: i want to store the time value in “2020-07-02T20:30:00.3966933Z” but using N1QL query function STR_TO_UTC it gives me “2020-07-02T20:30:00.396Z”
Sample Document:
[
{
“SampleDoc”: {
"departureTime": "2020-07-02T15:00:00",
"destination": "DEN",
"docType": "TEST-DOC",
"flightNumber": 1234,
"lastUpdatedOn": "2020-07-02T20:30:00.3966933Z-05:00",
"origin": "FCA",
“id”: “1234+FCA”
}
}
]
My Solution:
public async Task<dynamic> UpdateToUtcTime()
{
var collection = _bucket.DefaultCollection();
var queryString = $"SELECT * FROM `{this._bucket.Name}` WHERE docType = 'TEST-DOC' AND DATE_TRUNC_STR(departureTime, 'day')" +
$" = '2020-07-03T00:00:00'";
var queryResult = await _cluster.QueryAsync<MyResponse>(queryString, new Couchbase.Query.QueryOptions()).ConfigureAwait(false);
int i = 0;
await foreach (var record in queryResult.Rows)
{
var convertToUtcTime = record.SampleDoc.LastUpdatedOn.ToUniversalTime();
record.SampleDoc.LastUpdatedOn = convertToUtcTime;
var id = record.SampleDoc.Id;
var upsertResult = await collection.UpsertAsync(id, record.SampleDoc).ConfigureAwait(false);
Console.WriteLine(id);
i++;
}
Console.WriteLine(i);
return null;
}
Please suggest me what can be done in order to avoid upserting and update only the field required to update. Using this code. i have almost 2000 records for a specific day and in total almost 1 million records. it is taking 60 seconds with this approach for 2000 records. if i need to run for all the records i need another clean approach on how to update all the documents