|
20 | 20 | using MongoDB.Bson;
|
21 | 21 | using MongoDB.Bson.IO;
|
22 | 22 | using MongoDB.Bson.Serialization;
|
| 23 | +using MongoDB.Bson.Serialization.Serializers; |
23 | 24 | using MongoDB.Driver.Core.Misc;
|
24 | 25 | using MongoDB.Driver.GeoJsonObjectModel;
|
25 | 26 | using MongoDB.Driver.Linq;
|
@@ -291,6 +292,94 @@ public FilterDefinition<TDocument> AnyNin<TItem>(Expression<Func<TDocument, IEnu
|
291 | 292 | return AnyNin(new ExpressionFieldDefinition<TDocument>(field), values);
|
292 | 293 | }
|
293 | 294 |
|
| 295 | + /// <summary> |
| 296 | + /// Creates an in filter for a string array field. |
| 297 | + /// </summary> |
| 298 | + /// <param name="field">The field.</param> |
| 299 | + /// <param name="values">The values.</param> |
| 300 | + /// <returns>An in filter.</returns> |
| 301 | + public FilterDefinition<TDocument> AnyStringIn(FieldDefinition<TDocument, IEnumerable<string>> field, IEnumerable<StringOrRegularExpression> values) |
| 302 | + { |
| 303 | + return new StringArrayFieldInOrNinFilterDefinition<TDocument>(field, "$in", values); |
| 304 | + } |
| 305 | + |
| 306 | + /// <summary> |
| 307 | + /// Creates an in filter for a string array field. |
| 308 | + /// </summary> |
| 309 | + /// <param name="field">The field.</param> |
| 310 | + /// <param name="values">The values.</param> |
| 311 | + /// <returns>An in filter.</returns> |
| 312 | + public FilterDefinition<TDocument> AnyStringIn(FieldDefinition<TDocument, IEnumerable<string>> field, params StringOrRegularExpression[] values) |
| 313 | + { |
| 314 | + return AnyStringIn(field, (IEnumerable<StringOrRegularExpression>)values); |
| 315 | + } |
| 316 | + |
| 317 | + /// <summary> |
| 318 | + /// Creates an in filter for a string array field. |
| 319 | + /// </summary> |
| 320 | + /// <param name="field">The field.</param> |
| 321 | + /// <param name="values">The values.</param> |
| 322 | + /// <returns>An in filter.</returns> |
| 323 | + public FilterDefinition<TDocument> AnyStringIn(Expression<Func<TDocument, IEnumerable<string>>> field, IEnumerable<StringOrRegularExpression> values) |
| 324 | + { |
| 325 | + return new StringArrayFieldInOrNinFilterDefinition<TDocument>(new ExpressionFieldDefinition<TDocument, IEnumerable<string>>(field), "$in", values); |
| 326 | + } |
| 327 | + |
| 328 | + /// <summary> |
| 329 | + /// Creates an in filter for a string array field. |
| 330 | + /// </summary> |
| 331 | + /// <param name="field">The field.</param> |
| 332 | + /// <param name="values">The values.</param> |
| 333 | + /// <returns>An in filter.</returns> |
| 334 | + public FilterDefinition<TDocument> AnyStringIn(Expression<Func<TDocument, IEnumerable<string>>> field, params StringOrRegularExpression[] values) |
| 335 | + { |
| 336 | + return AnyStringIn(field, (IEnumerable<StringOrRegularExpression>)values); |
| 337 | + } |
| 338 | + |
| 339 | + /// <summary> |
| 340 | + /// Creates a not in filter for a string array field. |
| 341 | + /// </summary> |
| 342 | + /// <param name="field">The field.</param> |
| 343 | + /// <param name="values">The values.</param> |
| 344 | + /// <returns>A not in filter.</returns> |
| 345 | + public FilterDefinition<TDocument> AnyStringNin(FieldDefinition<TDocument, IEnumerable<string>> field, IEnumerable<StringOrRegularExpression> values) |
| 346 | + { |
| 347 | + return new StringArrayFieldInOrNinFilterDefinition<TDocument>(field, "$nin", values); |
| 348 | + } |
| 349 | + |
| 350 | + /// <summary> |
| 351 | + /// Creates a not in filter for a string array field. |
| 352 | + /// </summary> |
| 353 | + /// <param name="field">The field.</param> |
| 354 | + /// <param name="values">The values.</param> |
| 355 | + /// <returns>A not in filter.</returns> |
| 356 | + public FilterDefinition<TDocument> AnyStringNin(FieldDefinition<TDocument, IEnumerable<string>> field, params StringOrRegularExpression[] values) |
| 357 | + { |
| 358 | + return AnyStringNin(field, (IEnumerable<StringOrRegularExpression>)values); |
| 359 | + } |
| 360 | + |
| 361 | + /// <summary> |
| 362 | + /// Creates a not in filter for a string array field. |
| 363 | + /// </summary> |
| 364 | + /// <param name="field">The field.</param> |
| 365 | + /// <param name="values">The values.</param> |
| 366 | + /// <returns>A not in filter.</returns> |
| 367 | + public FilterDefinition<TDocument> AnyStringNin(Expression<Func<TDocument, IEnumerable<string>>> field, IEnumerable<StringOrRegularExpression> values) |
| 368 | + { |
| 369 | + return new StringArrayFieldInOrNinFilterDefinition<TDocument>(new ExpressionFieldDefinition<TDocument, IEnumerable<string>>(field), "$nin", values); |
| 370 | + } |
| 371 | + |
| 372 | + /// <summary> |
| 373 | + /// Creates a not in filter for a string array field. |
| 374 | + /// </summary> |
| 375 | + /// <param name="field">The field.</param> |
| 376 | + /// <param name="values">The values.</param> |
| 377 | + /// <returns>A not in filter.</returns> |
| 378 | + public FilterDefinition<TDocument> AnyStringNin(Expression<Func<TDocument, IEnumerable<string>>> field, params StringOrRegularExpression[] values) |
| 379 | + { |
| 380 | + return AnyStringNin(field, (IEnumerable<StringOrRegularExpression>)values); |
| 381 | + } |
| 382 | + |
294 | 383 | /// <summary>
|
295 | 384 | /// Creates a bits all clear filter.
|
296 | 385 | /// </summary>
|
@@ -1408,6 +1497,94 @@ public FilterDefinition<TDocument> SizeLte(Expression<Func<TDocument, object>> f
|
1408 | 1497 | return SizeLte(new ExpressionFieldDefinition<TDocument>(field), size);
|
1409 | 1498 | }
|
1410 | 1499 |
|
| 1500 | + /// <summary> |
| 1501 | + /// Creates an in filter for a string field. |
| 1502 | + /// </summary> |
| 1503 | + /// <param name="field">The field.</param> |
| 1504 | + /// <param name="values">The values.</param> |
| 1505 | + /// <returns>An in filter.</returns> |
| 1506 | + public FilterDefinition<TDocument> StringIn(FieldDefinition<TDocument, string> field, IEnumerable<StringOrRegularExpression> values) |
| 1507 | + { |
| 1508 | + return new StringFieldInOrNinFilterDefinition<TDocument>(field, "$in", values); |
| 1509 | + } |
| 1510 | + |
| 1511 | + /// <summary> |
| 1512 | + /// Creates an in filter for a string field. |
| 1513 | + /// </summary> |
| 1514 | + /// <param name="field">The field.</param> |
| 1515 | + /// <param name="values">The values.</param> |
| 1516 | + /// <returns>An in filter.</returns> |
| 1517 | + public FilterDefinition<TDocument> StringIn(FieldDefinition<TDocument, string> field, params StringOrRegularExpression[] values) |
| 1518 | + { |
| 1519 | + return StringIn(field, (IEnumerable<StringOrRegularExpression>)values); |
| 1520 | + } |
| 1521 | + |
| 1522 | + /// <summary> |
| 1523 | + /// Creates an in filter for a string field. |
| 1524 | + /// </summary> |
| 1525 | + /// <param name="field">The field.</param> |
| 1526 | + /// <param name="values">The values.</param> |
| 1527 | + /// <returns>An in filter.</returns> |
| 1528 | + public FilterDefinition<TDocument> StringIn(Expression<Func<TDocument, string>> field, IEnumerable<StringOrRegularExpression> values) |
| 1529 | + { |
| 1530 | + return new StringFieldInOrNinFilterDefinition<TDocument>(new ExpressionFieldDefinition<TDocument, string>(field), "$in", values); |
| 1531 | + } |
| 1532 | + |
| 1533 | + /// <summary> |
| 1534 | + /// Creates an in filter for a string field. |
| 1535 | + /// </summary> |
| 1536 | + /// <param name="field">The field.</param> |
| 1537 | + /// <param name="values">The values.</param> |
| 1538 | + /// <returns>An in filter.</returns> |
| 1539 | + public FilterDefinition<TDocument> StringIn(Expression<Func<TDocument, string>> field, params StringOrRegularExpression[] values) |
| 1540 | + { |
| 1541 | + return StringIn(field, (IEnumerable<StringOrRegularExpression>)values); |
| 1542 | + } |
| 1543 | + |
| 1544 | + /// <summary> |
| 1545 | + /// Creates a not in filter for a string field. |
| 1546 | + /// </summary> |
| 1547 | + /// <param name="field">The field.</param> |
| 1548 | + /// <param name="values">The values.</param> |
| 1549 | + /// <returns>A not in filter.</returns> |
| 1550 | + public FilterDefinition<TDocument> StringNin(FieldDefinition<TDocument, string> field, IEnumerable<StringOrRegularExpression> values) |
| 1551 | + { |
| 1552 | + return new StringFieldInOrNinFilterDefinition<TDocument>(field, "$nin", values); |
| 1553 | + } |
| 1554 | + |
| 1555 | + /// <summary> |
| 1556 | + /// Creates a not in filter for a string field. |
| 1557 | + /// </summary> |
| 1558 | + /// <param name="field">The field.</param> |
| 1559 | + /// <param name="values">The values.</param> |
| 1560 | + /// <returns>A not in filter.</returns> |
| 1561 | + public FilterDefinition<TDocument> StringNin(FieldDefinition<TDocument, string> field, params StringOrRegularExpression[] values) |
| 1562 | + { |
| 1563 | + return StringNin(field, (IEnumerable<StringOrRegularExpression>)values); |
| 1564 | + } |
| 1565 | + |
| 1566 | + /// <summary> |
| 1567 | + /// Creates a not in filter for a string field. |
| 1568 | + /// </summary> |
| 1569 | + /// <param name="field">The field.</param> |
| 1570 | + /// <param name="values">The values.</param> |
| 1571 | + /// <returns>A not in filter.</returns> |
| 1572 | + public FilterDefinition<TDocument> StringNin(Expression<Func<TDocument, string>> field, IEnumerable<StringOrRegularExpression> values) |
| 1573 | + { |
| 1574 | + return new StringFieldInOrNinFilterDefinition<TDocument>(new ExpressionFieldDefinition<TDocument, string>(field), "$nin", values); |
| 1575 | + } |
| 1576 | + |
| 1577 | + /// <summary> |
| 1578 | + /// Creates a not in filter for a string field. |
| 1579 | + /// </summary> |
| 1580 | + /// <param name="field">The field.</param> |
| 1581 | + /// <param name="values">The values.</param> |
| 1582 | + /// <returns>A not in filter.</returns> |
| 1583 | + public FilterDefinition<TDocument> StringNin(Expression<Func<TDocument, string>> field, params StringOrRegularExpression[] values) |
| 1584 | + { |
| 1585 | + return StringNin(field, (IEnumerable<StringOrRegularExpression>)values); |
| 1586 | + } |
| 1587 | + |
1411 | 1588 | /// <summary>
|
1412 | 1589 | /// Creates a text filter.
|
1413 | 1590 | /// </summary>
|
@@ -2327,6 +2504,85 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
|
2327 | 2504 | }
|
2328 | 2505 | }
|
2329 | 2506 |
|
| 2507 | + internal abstract class StringInOrNinFilterDefinition<TDocument, TField> : FilterDefinition<TDocument> |
| 2508 | + { |
| 2509 | + private readonly FieldDefinition<TDocument, TField> _field; |
| 2510 | + private readonly string _operator; |
| 2511 | + private readonly IEnumerable<StringOrRegularExpression> _values; |
| 2512 | + |
| 2513 | + public StringInOrNinFilterDefinition( |
| 2514 | + FieldDefinition<TDocument, TField> field, |
| 2515 | + string @operator, |
| 2516 | + IEnumerable<StringOrRegularExpression> values) |
| 2517 | + { |
| 2518 | + _field = Ensure.IsNotNull(field, nameof(field)); |
| 2519 | + _operator = Ensure.IsNotNull(@operator, nameof(@operator)); |
| 2520 | + _values = Ensure.IsNotNull(values, nameof(values)); |
| 2521 | + |
| 2522 | + if (@operator != "$in" && @operator != "$nin") |
| 2523 | + { |
| 2524 | + throw new ArgumentException($"Invalid operator: {@operator}."); |
| 2525 | + } |
| 2526 | + } |
| 2527 | + |
| 2528 | + public override BsonDocument Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry, LinqProvider linqProvider) |
| 2529 | + { |
| 2530 | + var renderedField = _field.Render(documentSerializer, serializerRegistry, linqProvider); |
| 2531 | + |
| 2532 | + var document = new BsonDocument(); |
| 2533 | + using (var bsonWriter = new BsonDocumentWriter(document)) |
| 2534 | + { |
| 2535 | + var context = BsonSerializationContext.CreateRoot(bsonWriter); |
| 2536 | + var stringSerializer = BsonStringSerializer.Instance; |
| 2537 | + var regularExpressionSerializer = BsonRegularExpressionSerializer.Instance; |
| 2538 | + |
| 2539 | + bsonWriter.WriteStartDocument(); |
| 2540 | + bsonWriter.WriteName(renderedField.FieldName); |
| 2541 | + bsonWriter.WriteStartDocument(); |
| 2542 | + bsonWriter.WriteName(_operator); |
| 2543 | + bsonWriter.WriteStartArray(); |
| 2544 | + foreach (var value in _values) |
| 2545 | + { |
| 2546 | + if (value?.Type == typeof(BsonRegularExpression)) |
| 2547 | + { |
| 2548 | + regularExpressionSerializer.Serialize(context, value.RegularExpression); |
| 2549 | + } |
| 2550 | + else |
| 2551 | + { |
| 2552 | + stringSerializer.Serialize(context, value?.String); |
| 2553 | + } |
| 2554 | + } |
| 2555 | + bsonWriter.WriteEndArray(); |
| 2556 | + bsonWriter.WriteEndDocument(); |
| 2557 | + bsonWriter.WriteEndDocument(); |
| 2558 | + } |
| 2559 | + |
| 2560 | + return document; |
| 2561 | + } |
| 2562 | + } |
| 2563 | + |
| 2564 | + internal sealed class StringArrayFieldInOrNinFilterDefinition<TDocument> : StringInOrNinFilterDefinition<TDocument, IEnumerable<string>> |
| 2565 | + { |
| 2566 | + public StringArrayFieldInOrNinFilterDefinition( |
| 2567 | + FieldDefinition<TDocument, IEnumerable<string>> field, |
| 2568 | + string @operator, |
| 2569 | + IEnumerable<StringOrRegularExpression> values) |
| 2570 | + : base(field, @operator, values) |
| 2571 | + { |
| 2572 | + } |
| 2573 | + } |
| 2574 | + |
| 2575 | + internal sealed class StringFieldInOrNinFilterDefinition<TDocument> : StringInOrNinFilterDefinition<TDocument, string> |
| 2576 | + { |
| 2577 | + public StringFieldInOrNinFilterDefinition( |
| 2578 | + FieldDefinition<TDocument, string> field, |
| 2579 | + string @operator, |
| 2580 | + IEnumerable<StringOrRegularExpression> values) |
| 2581 | + : base(field, @operator, values) |
| 2582 | + { |
| 2583 | + } |
| 2584 | + } |
| 2585 | + |
2330 | 2586 | internal sealed class UInt32GreaterThanFilterDefinition<TDocument> : FilterDefinition<TDocument>
|
2331 | 2587 | {
|
2332 | 2588 | private readonly string _operatorName;
|
|
0 commit comments