Оператор MongoDB conditional UpdateMany, включающий выражение с использованием драйвера .net

#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. (УСТРАНЕНО) Для обновления состояния до ‘1’ в дополнение к полю ‘assigned_to’
  2. (УСТРАНЕНО) Для автоматического вычисления метки времени (текущего времени)
  3. В конце концов, чтобы он работал с моим приложением 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 # 🙂