Skip to content

Commit 57f8b42

Browse files
committed
CSHARP-1410: Allow $type to support string representations of type (in 1.x).
1 parent 8820b1f commit 57f8b42

File tree

3 files changed

+114
-0
lines changed

3 files changed

+114
-0
lines changed

MongoDB.Driver/Builders/QueryBuilder.cs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,27 @@ public static IMongoQuery Type(string name, BsonType type)
684684
return new QueryDocument(name, condition);
685685
}
686686

687+
/// <summary>
688+
/// Tests that the type of the named element is equal to some type (see $type).
689+
/// </summary>
690+
/// <param name="name">The name of the element to test.</param>
691+
/// <param name="type">The type to compare to.</param>
692+
/// <returns>An IMongoQuery.</returns>
693+
public static IMongoQuery Type(string name, string type)
694+
{
695+
if (name == null)
696+
{
697+
throw new ArgumentNullException("name");
698+
}
699+
if (type == null)
700+
{
701+
throw new ArgumentNullException("type");
702+
}
703+
704+
var condition = new BsonDocument("$type", type);
705+
return new QueryDocument(name, condition);
706+
}
707+
687708
/// <summary>
688709
/// Tests that a JavaScript expression is true (see $where).
689710
/// </summary>
@@ -1448,6 +1469,18 @@ public static IMongoQuery Type<TMember>(Expression<Func<TDocument, TMember>> mem
14481469
return new QueryBuilder<TDocument>().Type(memberExpression, type);
14491470
}
14501471

1472+
/// <summary>
1473+
/// Tests that the type of the named element is equal to some type (see $type).
1474+
/// </summary>
1475+
/// <typeparam name="TMember">The member type.</typeparam>
1476+
/// <param name="memberExpression">The member expression representing the element to test.</param>
1477+
/// <param name="type">The type to compare to.</param>
1478+
/// <returns>An IMongoQuery.</returns>
1479+
public static IMongoQuery Type<TMember>(Expression<Func<TDocument, TMember>> memberExpression, string type)
1480+
{
1481+
return new QueryBuilder<TDocument>().Type(memberExpression, type);
1482+
}
1483+
14511484
/// <summary>
14521485
/// Tests that any of the values in the named array element is equal to some type (see $type).
14531486
/// </summary>
@@ -1460,6 +1493,18 @@ public static IMongoQuery Type<TValue>(Expression<Func<TDocument, IEnumerable<TV
14601493
return new QueryBuilder<TDocument>().Type(memberExpression, type);
14611494
}
14621495

1496+
/// <summary>
1497+
/// Tests that any of the values in the named array element is equal to some type (see $type).
1498+
/// </summary>
1499+
/// <typeparam name="TValue">The type of the value.</typeparam>
1500+
/// <param name="memberExpression">The member expression representing the element to test.</param>
1501+
/// <param name="type">The type to compare to.</param>
1502+
/// <returns>An IMongoQuery.</returns>
1503+
public static IMongoQuery Type<TValue>(Expression<Func<TDocument, IEnumerable<TValue>>> memberExpression, string type)
1504+
{
1505+
return new QueryBuilder<TDocument>().Type(memberExpression, type);
1506+
}
1507+
14631508
/// <summary>
14641509
/// Builds a query from an expression.
14651510
/// </summary>
@@ -2301,6 +2346,24 @@ public IMongoQuery Type<TMember>(Expression<Func<TDocument, TMember>> memberExpr
23012346
return Query.Type(serializationInfo.ElementName, type);
23022347
}
23032348

2349+
/// <summary>
2350+
/// Tests that the type of the named element is equal to some type (see $type).
2351+
/// </summary>
2352+
/// <typeparam name="TMember">The member type.</typeparam>
2353+
/// <param name="memberExpression">The member expression representing the element to test.</param>
2354+
/// <param name="type">The type to compare to.</param>
2355+
/// <returns>An IMongoQuery.</returns>
2356+
public IMongoQuery Type<TMember>(Expression<Func<TDocument, TMember>> memberExpression, string type)
2357+
{
2358+
if (memberExpression == null)
2359+
{
2360+
throw new ArgumentNullException("memberExpression");
2361+
}
2362+
2363+
var serializationInfo = _serializationInfoHelper.GetSerializationInfo(memberExpression);
2364+
return Query.Type(serializationInfo.ElementName, type);
2365+
}
2366+
23042367
/// <summary>
23052368
/// Tests that any of the values in the named array element is equal to some type (see $type).
23062369
/// </summary>
@@ -2319,6 +2382,24 @@ public IMongoQuery Type<TValue>(Expression<Func<TDocument, IEnumerable<TValue>>>
23192382
return Query.Type(serializationInfo.ElementName, type);
23202383
}
23212384

2385+
/// <summary>
2386+
/// Tests that any of the values in the named array element is equal to some type (see $type).
2387+
/// </summary>
2388+
/// <typeparam name="TValue">The type of the value.</typeparam>
2389+
/// <param name="memberExpression">The member expression representing the element to test.</param>
2390+
/// <param name="type">The type to compare to.</param>
2391+
/// <returns>An IMongoQuery.</returns>
2392+
public IMongoQuery Type<TValue>(Expression<Func<TDocument, IEnumerable<TValue>>> memberExpression, string type)
2393+
{
2394+
if (memberExpression == null)
2395+
{
2396+
throw new ArgumentNullException("memberExpression");
2397+
}
2398+
2399+
var serializationInfo = _serializationInfoHelper.GetSerializationInfo(memberExpression);
2400+
return Query.Type(serializationInfo.ElementName, type);
2401+
}
2402+
23222403
/// <summary>
23232404
/// Builds a query from an expression.
23242405
/// </summary>

MongoDB.DriverUnitTests/Builders/QueryBuilderTests.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -938,6 +938,15 @@ public void TestType()
938938
Assert.AreEqual(NegativeTest("a", selector), Query.Not(query).ToJson());
939939
}
940940

941+
[Test]
942+
public void TestType_number()
943+
{
944+
var query = Query.Type("a", "number");
945+
var selector = "{ \"$type\" : \"number\" }";
946+
Assert.AreEqual(PositiveTest("a", selector), query.ToJson());
947+
Assert.AreEqual(NegativeTest("a", selector), Query.Not(query).ToJson());
948+
}
949+
941950
[Test]
942951
public void TestWhere()
943952
{

MongoDB.DriverUnitTests/Builders/QueryBuilderTypedTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,14 @@ public void TestType()
928928
Assert.AreEqual(expected, query.ToJson());
929929
}
930930

931+
[Test]
932+
public void TestType_number()
933+
{
934+
var query = Query<A>.Type(a => a.S, "number");
935+
var expected = "{ \"s\" : { \"$type\" : \"number\" } }";
936+
Assert.AreEqual(expected, query.ToJson());
937+
}
938+
931939
[Test]
932940
public void TestType_Not()
933941
{
@@ -936,6 +944,14 @@ public void TestType_Not()
936944
Assert.AreEqual(expected, query.ToJson());
937945
}
938946

947+
[Test]
948+
public void TestType_Not_number()
949+
{
950+
var query = Query.Not(Query<A>.Type(a => a.S, "number"));
951+
var expected = "{ \"s\" : { \"$not\" : { \"$type\" : \"number\" } } }";
952+
Assert.AreEqual(expected, query.ToJson());
953+
}
954+
939955
[Test]
940956
public void TestType_Array()
941957
{
@@ -944,6 +960,14 @@ public void TestType_Array()
944960
Assert.AreEqual(expected, query.ToJson());
945961
}
946962

963+
[Test]
964+
public void TestType_Array_number()
965+
{
966+
var query = Query<A>.Type(a => a.J, "number");
967+
var expected = "{ \"j\" : { \"$type\" : \"number\" } }";
968+
Assert.AreEqual(expected, query.ToJson());
969+
}
970+
947971
[Test]
948972
public void TestWhere()
949973
{

0 commit comments

Comments
 (0)