MongoDB .NET driver aggregation $text $search phrase not returning results

Hi,

I have an aggregation pipeline with a $match $text $search stage, when I execute it in MongoDb Compass, the query returns the results. But the same query returns nothing when executed in dotnet.

When I remove the double quotes (phrase) the query in dotnet returns the same result as in Compass.

MongoDB Compass:

{
  $text: {
    $search: "\"searchedquery\""
  },
}

.NET:

var stage1 = new BsonDocument("$match", new BsonDocument("$text", 
        new BsonDocument("$search", $"\"{searchRequest.Query}\""
)));

Please advice.

Hi, @Jorn_Kersseboom,

Welcome to the MongoDB Community Forums.

I understand that the MongoDB .NET/C# Driver is not returning the same results as MongoDB Compass for a $text search. I inserted the following 3 documents in a collection via mongosh:

[
  {
    _id: ObjectId("64076217e3c19f9160c2fd0e"),
    words: 'word1 word2 word3'
  },
  {
    _id: ObjectId("6407621ce3c19f9160c2fd0f"),
    words: 'word1 word2 word3 word4'
  },
  {
    _id: ObjectId("64076226e3c19f9160c2fd10"),
    words: 'wordr2 word1 word3'
  }
]

and created a text index:

db.textsearch.createIndex({words: "text"})

Running the text search in mongosh the first two documents are returned, but not the third (as expected):

test> db.textsearch.aggregate([{ $match: { $text: { $search: "\"word1 word2 word3\"" } } }])
[
  {
    _id: ObjectId("64076217e3c19f9160c2fd0e"),
    words: 'word1 word2 word3'
  },
  {
    _id: ObjectId("6407621ce3c19f9160c2fd0f"),
    words: 'word1 word2 word3 word4'
  }
]

Running the following minimal C# repro:

using System;
using MongoDB.Bson;
using MongoDB.Driver;

var client = new MongoClient();
var db = client.GetDatabase("test");
var coll = db.GetCollection<BsonDocument>("textsearch");

var searchRequest = new { Query = "word1 word2 word3" };

var stage1 = new BsonDocument("$match", new BsonDocument("$text",
    new BsonDocument("$search", $"\"{searchRequest.Query}\""
    )));
var query = coll.Aggregate().AppendStage<BsonDocument>(stage1);
foreach (var doc in query.ToList())
{
    Console.WriteLine(doc);
}
Console.WriteLine(query);

I received back the same two documents. I also print out the MQL that is sent to the server, which is the same as executed in mongosh:

{ "_id" : ObjectId("64076217e3c19f9160c2fd0e"), "words" : "word1 word2 word3" }
{ "_id" : ObjectId("6407621ce3c19f9160c2fd0f"), "words" : "word1 word2 word3 word4" }
aggregate([{ "$match" : { "$text" : { "$search" : "\"word1 word2 word3\"" } } }])

I would recommend writing your aggregation pipeline to the console to look for any differences potentially added by other stages.

NOTE: You can use Builders<T>.Filter.Text to construct the query stage rather than BsonDocument.

var filter = Builders<BsonDocument>.Filter.Text($"\"{searchRequest.Query}\"");
var query = coll.Aggregate().Match(filter);
Console.WriteLine(query);

This outputs the identical query as displayed above.

Hope that helps in your debugging efforts.

Sincerely,
James

Hi,

Thanks for the quick reply, I was able to reproduce your usecase and indeed the results were the same. I investigated my pipeline further and found that I made a mistake in another $match stage with $or.

This helped a lot!
Nice day.

This topic was automatically closed 5 days after the last reply. New replies are no longer allowed.