В вопросе №1 разделим его на две части. Во-первых, увеличьте любой документ, который имеет «items.item_name», равный «my_item_two». Для этого вам придется использовать позиционный оператор «$». Что-то вроде:
db.bar.update( {user_id : 123456 , "items.item_name" : "my_item_two" } ,
{$inc : {"items.$.price" : 1} } ,
false ,
true);
Обратите внимание, что это только увеличит первый подобранный поддокумент в любом массиве (так что если у вас есть другой документ в массиве с «item_name», равным «my_item_two», он не будет получить прирост). Но это может быть то, что вы хотите.
Вторая часть сложнее. Мы можем вывести новый элемент в массив без «my_item_two» следующим образом:
db.bar.update( {user_id : 123456, "items.item_name" : {$ne : "my_item_two" }} ,
{$addToSet : {"items" : {'item_name' : "my_item_two" , 'price' : 1 }} } ,
false ,
true);
Для вашего вопроса №2 ответ проще. Чтобы увеличить общую сумму и цену item_three в любом документе, который содержит «my_item_three», вы можете одновременно использовать оператор $ inc на нескольких полях. Что-то вроде:
db.bar.update( {"items.item_name" : {$ne : "my_item_three" }} ,
{$inc : {total : 1 , "items.$.price" : 1}} ,
false ,
true);
Enum.GetValues
возвращает System.Array
и System.Array
реализует только IEnumerable
, а не ] IEnumerable
, поэтому вам нужно будет использовать метод расширения Enumerable.OfType
для преобразования IEnumerable
в IEnumerable
следующим образом:
Enum.GetValues(typeof(Suit))
.OfType<Suit>()
.Where(x => x != param);
Изменить: Я удалил вызов IEnumerable.Select
, поскольку это была лишняя проекция без какого-либо значимого перевода. Вы можете свободно фильтровать IEnumerable
, который возвращается из OfType
.
Массив реализует IEnumerable, поэтому вам нужно будет использовать Cast<Suit>
или OfType<Suit>
, чтобы получить расширения IEnumerble<T>
, такие как ToList ();