#c# #.net #mongodb #aggregation-framework
#c# #.net #mongodb #агрегация-фреймворк
Вопрос:
У меня есть следующий документ:
{
"_id": {
"$oid": "5fc232d9b9b390623ce498ee"
},
"trigger": {
"type": 0,
"interval": 15
},
"startTime": {
"$numberLong": "1608078905"
},
"state": 0,
"assigned_to": ""
}
И у меня есть оператор UpdateMany, который обновляет документы только в том случае, если их начальное время (интервал времени) интервал (секунды) меньше, чем равно текущей временной метке со значением ‘компьютер a’, (ОБНОВЛЕНИЕ) и устанавливает для атрибута ‘state’ значение ‘1’:
(ОБНОВЛЕНИЕ)
db.mycollection.updateMany(
{ state: 0 },
[
{ $set: { assigned_to: { $switch: {
branches: [
{ case: { $lte: [ { $add: [ "$startTime", "$trigger.interval" ] }, new Timestamp() ] }, then: "computer a" }
],
default: ""
} } } },
{ $set: { state: 1 } }
]
)
Мои цели:
- (УСТРАНЕНО) Для обновления состояния до ‘1’ в дополнение к полю ‘assigned_to’
- (УСТРАНЕНО) Для автоматического вычисления метки времени (текущего времени)
- В конце концов, чтобы он работал с моим приложением C # .NET Core (если возможно — с синтаксисом драйвера, чтобы он был строго типизирован)
На стороне C # я попробовал следующее (безуспешно):
var results = _jobs.UpdateMany(
f => (f.StartTime f.Trigger.Interval) <= DateTimeOffset.Now.ToUnixTimeSeconds(),
o => o.AssignedTo == "computer a");
Другой подход, который я пробовал:
var builder = Builders<Job>.Filter;
var filters =
builder.Lte(o => o.StartTime o.Trigger.Interval, DateTimeOffset.Now.ToUnixTimeSeconds()) amp;
builder.Eq(o => o.AssignedTo, string.Empty);
var updateDefinition =
Builders<Job>.Update.Set(x => x.AssignedTo, Environment.MachineName);
var result = _jobs.UpdateMany(filters, updateDefinition);
Потратив несколько часов, я добиваюсь только приведенного выше оператора UpdateMany.
Если у вас есть идеи о том, как это можно сделать лучше — я свободен для предложений.
Комментарии:
1. Вы можете назначить / обновить несколько полей внутри
$set
. (1) Это означает, что «обновить состояние до ‘1’ в дополнение к полю ‘assigned_to'» — это указать другое поле внутри$set
. (2) «Для автоматического вычисления временной метки» : вы указываете вычисление временной метки в$set
. Как выглядит вычисление? (Я не программист c #).2. (1) даст ему шанс — спасибо! (2) это больше связано с mongo — есть ли способ сообщить mongo «new Date ()», но сохранить его в timestamp, а не как объект «date»? (моя цель — сохранить текущую временную метку вместо ее вычисления и отправки явно)
3. MongoDB имеет типы данных как
Date
иTimestamps
; см. Типы BSON .4. еще раз спасибо! это работает, и я обновил исходный вопрос. Теперь я остался только с частью C # 🙂