2016-03-08 3 views
2

Я ищу способ условно комбинировать операции набора. На данный момент мне не удалось увеличиться на updateefinitions, не делая их последовательно пунктиром один за другим.mongodb C# комбинирование набор операций условно

например. вместо:

Builders<BsonDocument>.Update.Set("someElement.Length", b.Length) 
.Set("someElement.Path", b.Path) 

Я пытаюсь получить найти способ использовать что-то в напрасной из:

var update = Builders<BsonDocument>.Update; 
bool hasChanged = false; 
if (a.Length != b.Length) 
{ 
    hasChanged = true; 
    update.Set("someElement.Length", b.Length) 
} 
if (a.Path != b.Path) 
{ 
    hasChanged = true; 
    update.Set("someElement.Path", b.Path) 
} 

if (hasChanged) 
    await someCollection.UpdateOneAsync(Builders<someModel>.Filter.Eq("_id", a.Id), update); 

Есть ли способ сделать это, или я чеканка пирог в небе? Я не хочу заменить весь документ, и я ищу только обновленные поля, которые изменились.

+0

Почему бы просто не конкретизировать документ BSON для обновления напрямую, а не использовать помощники? В качестве документа BSON ключ верхнего уровня «$ set» ', и все поля для этой операции будут дочерними элементами этого ключа. Это в основном просто хэш/карта, поэтому применяются те же методы, что и для добавления/построения любого из них. На самом деле все «вспомогательные» функции, такие как 'Set()', действительно делают. –

+0

Ok звучит интересно, поэтому вместо него будут {$ set: {someElement.length: B.length, someElement.path: b.path}} и т. Д. И т. Д. Если это так, то ваше право. Это намного проще, и я могу легко понять, насколько такая функциональность будет мощной. – xxdefaultxx

+0

Я знаю, что документация соответствует соглашению «оболочка», поэтому примеры в JSON, но если вы в основном думаете, что возможный BSON выглядит примерно так же (в абстрактных терминах), то это просто вопрос построения. Вы бы намного лучше знакомы с базовой документацией, чем документация к драйверу. См. ['$ Set'] (https://docs.mongodb.org/manual/reference/operator/update/set/). Конечно, я прав. –

ответ

3

UpdateDefinition - неизменный объект, поэтому операции цепочки на них продолжают создавать новый каждый раз. Чтобы сделать это условно, вам нужно назначить результат самому себе, точно так же, как LINQ.

update = update.Set (...);

 Смежные вопросы

  • Нет связанных вопросов^_^