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