Как переключить логическое значение поля с помощью findAndModify? [Дубликат]

Попробуйте следующее:

def get_git_sha(git_dir='') {
    dir(git_dir) {
        return sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
    }
}

node(BUILD_NODE) {
    ...
    repo_SHA = get_git_sha('src/FooBar.git')
    echo repo_SHA
    ...
}

Проверено на:

  • Jenkins ver. 2.19.1
  • Трубопровод 2.4
13
задан styvane 7 April 2016 в 10:06
поделиться

2 ответа

Прямо сейчас, я не думаю, что это возможно сделать с одной операцией. Побитовые операторы (http://www.mongodb.org/display/DOCS/Updating#Updating-%24bit) еще не имеют «$ xor», хотя у меня есть патч для него.

В настоящее время обходным пути, о котором я думаю, всегда используется «$ inc»:

cl.update( { "_id": ...}, { '$inc' : { 'field' : 1 } } );

Затем вместо проверки на истинное или ложное вы можете проверить, является ли элемент «истинным»:

cl.find( { "_id": ..., 'field' : { '$mod' : [ 2, 1 ] } );

IE, вы используете оператор modulo, чтобы убедиться, что он четный или неравномерный, даже будучи «неустановленным», и неравномерно «установлен». Если вы хотите иметь oppposite поведение (т. Е. Найти все элементы, которые не имеют установленного флага), используйте

[ 2, 0 ];

15
ответ дан Derick 19 August 2018 в 14:05
поделиться
  • 1
    Хорошее решение, предложенное в #mongodb;) Билет в результате этого разговора здесь jira.mongodb.org/browse/SERVER-4362 – Remon van Vliet 27 February 2012 в 12:09
  • 2
    Это не будет масштабироваться очень хорошо, так как вы будете выполнять проверку коллекции каждый раз, когда выполняете запрос. – Pål Thingbø 12 April 2018 в 21:05

Проблема SERVER-4362 действительно разрешена сейчас, и вы имеете доступ к оператору обновления $bit . Таким образом, вместе с аргументом xor вы можете сделать это в атомном действии:

cl.findOneAndUpdate( 
  { "_id": ...}, 
  { 
     "$bit": { 
         "field": { "xor": NumberInt(1) } 
     } 
  },
  { "returnNewDocument": true, "upsert": true }
);

До тех пор, пока значение поля сохраняется в 0 или 1, то побитовый «флип» приведет к тому, что текущее значение будет противоположно тому, что было во время модификации.

.findOneAndUpdate() не требуется , а просто способ продемонстрировать, что результирующее значение отличается от каждой модификации.

4
ответ дан Neil Lunn 19 August 2018 в 14:05
поделиться
  • 1
    Есть ли способ использовать это для булевых значений вместо целых чисел? – mlovic 18 June 2016 в 14:38