Skip to content

Commit c598b60

Browse files
committed
wip
1 parent e9c1d38 commit c598b60

File tree

1 file changed

+293
-0
lines changed

1 file changed

+293
-0
lines changed
Lines changed: 293 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,293 @@
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

Comments
 (0)