Skip to content

Commit 1fe8dea

Browse files
committed
CSHARP-3535: Regression in support for $out to S3
1 parent a4a3888 commit 1fe8dea

File tree

2 files changed

+30
-8
lines changed

2 files changed

+30
-8
lines changed

src/MongoDB.Driver.Core/Core/Operations/AggregateToCollectionOperation.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -296,17 +296,21 @@ private IReadOnlyList<BsonDocument> SimplifyOutStageIfOutputDatabaseIsSameAsInpu
296296
var lastStageName = lastStage.GetElement(0).Name;
297297
if (lastStageName == "$out" && lastStage["$out"] is BsonDocument outDocument)
298298
{
299-
var outputDatabaseName = outDocument["db"].AsString;
300-
if (outputDatabaseName == _databaseNamespace.DatabaseName)
299+
if (outDocument.TryGetValue("db", out var db) && db.IsString &&
300+
outDocument.TryGetValue("coll", out var coll) && coll.IsString)
301301
{
302-
var outputCollectionName = outDocument["coll"].AsString;
303-
var simplifiedOutStage = lastStage.Clone().AsBsonDocument;
304-
simplifiedOutStage["$out"] = outputCollectionName;
302+
var outputDatabaseName = db.AsString;
303+
if (outputDatabaseName == _databaseNamespace.DatabaseName)
304+
{
305+
var outputCollectionName = coll.AsString;
306+
var simplifiedOutStage = lastStage.Clone().AsBsonDocument;
307+
simplifiedOutStage["$out"] = outputCollectionName;
305308

306-
var modifiedPipeline = new List<BsonDocument>(pipeline);
307-
modifiedPipeline[modifiedPipeline.Count - 1] = simplifiedOutStage;
309+
var modifiedPipeline = new List<BsonDocument>(pipeline);
310+
modifiedPipeline[modifiedPipeline.Count - 1] = simplifiedOutStage;
308311

309-
return modifiedPipeline;
312+
return modifiedPipeline;
313+
}
310314
}
311315
}
312316

tests/MongoDB.Driver.Core.Tests/Core/Operations/AggregateToCollectionOperationTests.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818
using System.Linq;
1919
using FluentAssertions;
2020
using MongoDB.Bson;
21+
using MongoDB.Bson.Serialization;
2122
using MongoDB.Bson.TestHelpers.XunitExtensions;
2223
using MongoDB.Driver.Core.Clusters;
2324
using MongoDB.Driver.Core.Misc;
2425
using MongoDB.Driver.Core.TestHelpers;
2526
using MongoDB.Driver.Core.TestHelpers.XunitExtensions;
27+
using MongoDB.Driver.Core.WireProtocol.Messages.Encoders;
2628
using Xunit;
2729

2830
namespace MongoDB.Driver.Core.Operations
@@ -70,6 +72,22 @@ public void Constructor_with_collectionNamespace_should_create_a_valid_instance(
7072
subject.WriteConcern.Should().BeNull();
7173
}
7274

75+
[Theory]
76+
[InlineData("{ $out : 'collection' }", "{ $out : 'collection' }")]
77+
[InlineData("{ $out : { db : 'database', coll : 'collection' } }", "{ $out : 'collection' }")]
78+
[InlineData("{ $out : { db : 'differentdatabase', coll : 'collection' } }", "{ $out : { db : 'differentdatabase', coll : 'collection' } }")]
79+
[InlineData("{ $out : { s3 : { } } }", "{ $out : { s3 : { } } }")]
80+
public void Constructor_should_simplify_out_stage_when_possible(string outStageJson, string expectedOutStageJson)
81+
{
82+
var databaseNamespace = new DatabaseNamespace("database");
83+
var pipeline = new[] { BsonDocument.Parse(outStageJson) };
84+
var messageEncoderSettings = new MessageEncoderSettings();
85+
86+
var subject = new AggregateToCollectionOperation(databaseNamespace, pipeline, messageEncoderSettings);
87+
88+
subject.Pipeline.Last().Should().Be(BsonDocument.Parse(expectedOutStageJson));
89+
}
90+
7391
[Fact]
7492
public void Constructor_should_throw_when_databaseNamespace_is_null()
7593
{

0 commit comments

Comments
 (0)