1+ using MongoDB . Bson ;
2+ using MongoDB . Bson . Serialization . Attributes ;
3+ using MongoDB . Bson . Serialization . Conventions ;
4+ using MongoDB . Driver ;
5+ using WriteData . Models ;
6+ using static System . Console ;
7+
8+ namespace CSharpExamples . WriteData ;
9+
10+ public static class UpdateArrays
11+ {
12+ private static IMongoCollection < Restaurant > _restaurantsCollection ;
13+ //private static string _mongoConnectionString = "<Your MongoDB URI>";
14+ private static string _mongoConnectionString =
15+ "mongodb+srv://mikewoofter:[email protected] /?retryWrites=true&w=majority" ; 16+
17+ public static UpdateResult UpdateOneArrayPush ( )
18+ {
19+ // start-update-one-push
20+ var filter = Builders < Restaurant > . Filter
21+ . Eq ( "name" , "Downtown Deli" ) ;
22+
23+ var update = Builders < Restaurant > . Update
24+ . Push ( restaurant => restaurant . Grades , new GradeEntry ( )
25+ {
26+ Date = DateTime . Now ,
27+ Grade = "A" ,
28+ Score = 96
29+ } ) ;
30+
31+ var result = _restaurantsCollection . UpdateOne ( filter , update ) ;
32+
33+ return result ;
34+ // end-update-one-push
35+ }
36+
37+ public static async Task < UpdateResult > UpdateOneArrayPushAsync ( )
38+ {
39+ // start-update-one-push-async
40+ var filter = Builders < Restaurant > . Filter
41+ . Eq ( "name" , "Downtown Deli" ) ;
42+
43+ var update = Builders < Restaurant > . Update
44+ . Push ( restaurant => restaurant . Grades , new GradeEntry ( )
45+ {
46+ Date = DateTime . Now ,
47+ Grade = "A" ,
48+ Score = 96
49+ } ) ;
50+
51+ var result = await _restaurantsCollection . UpdateOneAsync ( filter , update ) ;
52+
53+ return result ;
54+ // end-update-one-push-async
55+ }
56+
57+ public static UpdateResult UpdateOneArrayAddToSet ( )
58+ {
59+ // start-update-one-addtoset
60+ var filter = Builders < Restaurant > . Filter
61+ . Eq ( "name" , "Downtown Deli" ) ;
62+
63+ var firstGradeEntry = _restaurantsCollection . Find ( filter ) . FirstOrDefault ( ) . Grades [ 0 ] ;
64+
65+ var update = Builders < Restaurant > . Update
66+ . AddToSet ( restaurant => restaurant . Grades , firstGradeEntry ) ;
67+
68+ var result = _restaurantsCollection . UpdateOne ( filter , update ) ;
69+
70+ return result ;
71+ // end-update-one-addtoset
72+ }
73+
74+ public static async Task < UpdateResult > UpdateOneArrayAddToSetAsync ( )
75+ {
76+ // start-update-one-addtoset-async
77+ var filter = Builders < Restaurant > . Filter
78+ . Eq ( "name" , "Downtown Deli" ) ;
79+
80+ var firstGradeEntry = _restaurantsCollection . Find ( filter ) . FirstOrDefault ( ) . Grades [ 0 ] ;
81+
82+ var update = Builders < Restaurant > . Update
83+ . AddToSet ( restaurant => restaurant . Grades , firstGradeEntry ) ;
84+
85+ var result = await _restaurantsCollection . UpdateOneAsync ( filter , update ) ;
86+
87+ return result ;
88+ // end-update-one-addtoset-async
89+ }
90+
91+ public static UpdateResult UpdateManyArrayAddToSet ( )
92+ {
93+ // start-update-many-addtoset
94+ var filter = Builders < Restaurant > . Filter
95+ . Eq ( "name" , "Downtown Deli" ) ;
96+
97+ var firstGradeEntry = _restaurantsCollection . Find ( filter ) . FirstOrDefault ( ) . Grades [ 0 ] ;
98+
99+ var update = Builders < Restaurant > . Update
100+ . AddToSet ( restaurant => restaurant . Grades , firstGradeEntry ) ;
101+
102+ var result = _restaurantsCollection . UpdateMany ( filter , update ) ;
103+
104+ return result ;
105+ // end-update-many-addtoset
106+ }
107+
108+ public static async Task < UpdateResult > UpdateManyArrayAddToSetAsync ( )
109+ {
110+ // start-update-many-addtoset-async
111+ var filter = Builders < Restaurant > . Filter
112+ . Eq ( "name" , "Downtown Deli" ) ;
113+
114+ var firstGradeEntry = _restaurantsCollection . Find ( filter ) . FirstOrDefault ( ) . Grades [ 0 ] ;
115+
116+ var update = Builders < Restaurant > . Update
117+ . AddToSet ( restaurant => restaurant . Grades , firstGradeEntry ) ;
118+
119+ var result = await _restaurantsCollection . UpdateOneAsync ( filter , update ) ;
120+
121+ return result ;
122+ // end-update-many-addtoset-async
123+ }
124+
125+ public static UpdateResult UpdateManyArrayPushEach ( )
126+ {
127+ // start-update-many-pusheach
128+ var filter = Builders < Restaurant > . Filter
129+ . Eq ( "name" , "Downtown Deli" ) ;
130+
131+ var newGrades = new List < GradeEntry >
132+ {
133+ new GradeEntry { Date = DateTime . Now , Grade = "A" , Score = 95 } ,
134+ new GradeEntry { Date = DateTime . Now , Grade = "B+" , Score = 89 , }
135+ } ;
136+
137+ var scoreSort = Builders < GradeEntry > . Sort . Descending ( g => g . Score ) ;
138+
139+ var update = Builders < Restaurant > . Update . PushEach (
140+ "Grades" ,
141+ newGrades ,
142+ position : 0 ,
143+ sort : scoreSort ) ;
144+
145+ var result = _restaurantsCollection . UpdateMany ( filter , update ) ;
146+
147+ return result ;
148+ // end-update-many-pusheach
149+ }
150+
151+ public static UpdateResult UpdateManyArrayPushEach ( )
152+ {
153+ // start-update-many-pusheach
154+ var filter = Builders < Restaurant > . Filter
155+ . Eq ( "name" , "Downtown Deli" ) ;
156+
157+ var newGrades = new List < GradeEntry >
158+ {
159+ new GradeEntry { Date = DateTime . Now , Grade = "A" , Score = 95 } ,
160+ new GradeEntry { Date = DateTime . Now , Grade = "B+" , Score = 89 , }
161+ } ;
162+
163+ var scoreSort = Builders < GradeEntry > . Sort . Descending ( g => g . Score ) ;
164+
165+ var update = Builders < Restaurant > . Update . PushEach (
166+ "Grades" ,
167+ newGrades ,
168+ position : 0 ,
169+ sort : scoreSort ) ;
170+
171+ var result = _restaurantsCollection . UpdateMany ( filter , update ) ;
172+
173+ return result ;
174+ // end-update-many-pusheach
175+ }
176+
177+ public static async Task < UpdateResult > UpdateManyArrayPushEachAsync ( )
178+ {
179+ // start-update-many-pusheach-async
180+ var filter = Builders < Restaurant > . Filter
181+ . Eq ( "name" , "Downtown Deli" ) ;
182+
183+ var firstGradeEntry = _restaurantsCollection . Find ( filter ) . FirstOrDefault ( ) . Grades [ 0 ] ;
184+
185+ var update = Builders < Restaurant > . Update
186+ . AddToSet ( restaurant => restaurant . Grades , firstGradeEntry ) ;
187+
188+ var result = await _restaurantsCollection . UpdateOneAsync ( filter , update ) ;
189+
190+ return result ;
191+ // end-update-many-pusheach-async
192+ }
193+
194+ public static UpdateResult UpdateOneArrayPushEach ( )
195+ {
196+ // start-update-one-pusheach
197+ var filter = Builders < Restaurant > . Filter
198+ . Eq ( "name" , "Downtown Deli" ) ;
199+
200+ var newGrades = new List < GradeEntry >
201+ {
202+ new GradeEntry { Date = DateTime . Now , Grade = "A" , Score = 95 } ,
203+ new GradeEntry { Date = DateTime . Now , Grade = "B+" , Score = 89 , }
204+ } ;
205+
206+ var scoreSort = Builders < GradeEntry > . Sort . Descending ( g => g . Score ) ;
207+
208+ var update = Builders < Restaurant > . Update . PushEach (
209+ "Grades" ,
210+ newGrades ,
211+ position : 0 ,
212+ sort : scoreSort ) ;
213+
214+ var result = _restaurantsCollection . UpdateOne ( filter , update ) ;
215+
216+ return result ;
217+ // end-update-one-pusheach
218+ }
219+ public static async Task < UpdateResult > UpdateOneArrayPushEachAsync ( )
220+ {
221+ // start-update-one-pusheach-async
222+ var filter = Builders < Restaurant > . Filter
223+ . Eq ( "name" , "Downtown Deli" ) ;
224+
225+ var newGrades = new List < GradeEntry >
226+ {
227+ new GradeEntry { Date = DateTime . Now , Grade = "A" , Score = 95 } ,
228+ new GradeEntry { Date = DateTime . Now , Grade = "B+" , Score = 89 , }
229+ } ;
230+
231+ var scoreSort = Builders < GradeEntry > . Sort . Descending ( g => g . Score ) ;
232+
233+ var update = Builders < Restaurant > . Update . PushEach (
234+ "Grades" ,
235+ newGrades ,
236+ position : 0 ,
237+ sort : scoreSort ) ;
238+
239+ var result = _restaurantsCollection . UpdateOneAsync ( filter , update ) ;
240+
241+ return result ;
242+ // end-update-one-pusheach-async
243+ }
244+
245+ public static async Task < UpdateResult > UpdateOneArrayPushEachAsync ( )
246+ {
247+ // start-update-one-addtoset-async
248+ var filter = Builders < Restaurant > . Filter
249+ . Eq ( "name" , "Downtown Deli" ) ;
250+
251+ var firstGradeEntry = _restaurantsCollection . Find ( filter ) . FirstOrDefault ( ) . Grades [ 0 ] ;
252+
253+ var update = Builders < Restaurant > . Update
254+ . AddToSet ( restaurant => restaurant . Grades , firstGradeEntry ) ;
255+
256+ var result = await _restaurantsCollection . UpdateOneAsync ( filter , update ) ;
257+
258+ return result ;
259+ // end-update-one-addtoset-async
260+ }
261+
262+
263+ // private static void LinqTest()
264+ // {
265+ // var x = _restaurantsCollection.UpdateOne(l => l.Id == another.Id && l.AnArrayMember.Any(l => l.Id == anArrayId),
266+ // Builders<Restaurant>.Update.Set(l => l.AnArrayMember.ElementAt(-1).Deleted, true));
267+ //
268+ // Builders<ReplaceOne.Restaurant>.Update.
269+ // }
270+
271+ public static void Setup ( )
272+ {
273+ // This allows automapping of the camelCase database fields to our models.
274+ var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention ( ) } ;
275+ ConventionRegistry . Register ( "CamelCase" , camelCaseConvention , type => true ) ;
276+
277+ // Establish the connection to MongoDB and get the restaurants database
278+ var mongoClient = new MongoClient ( _mongoConnectionString ) ;
279+ var restaurantsDatabase = mongoClient . GetDatabase ( "sample_restaurants" ) ;
280+ _restaurantsCollection = restaurantsDatabase . GetCollection < Restaurant > ( "restaurants" ) ;
281+ }
282+
283+ public static void ResetSampleData ( )
284+ {
285+ var filter = Builders < Restaurant > . Filter
286+ . Eq ( "name" , "2 Bagels 2 Buns" ) ;
287+
288+ var update = Builders < Restaurant > . Update
289+ . Set ( restaurant => restaurant . Name , "Bagels N Buns" ) ;
290+
291+ _restaurantsCollection . UpdateOne ( filter , update ) ;
292+ }
293+ }
0 commit comments