I would like to do a Facet Search that returns the “$$SEARCH_META” based on the documentation (https://www.mongodb.com/docs/atlas/atlas-search/facet/). A snippet of the search definition from the documentation
is like the below. Im interested in defining the “{“$replaceWith”: “$$SEARCH_META”}

> {
    "$facet": {
      "docs": [
        { "$project":
          {
            "title": 1,
            "released": 1
          }
        }
      ],
      "meta": [
        {"$replaceWith": "$$SEARCH_META"},
        {"$limit": 1}
      ]
    }
  },

I have the following book Collection (Reduced for brevity)

[
{
“_id”: “11111”,
“Published”: true,
“Description”: “Description fo title 1”,
“Publisher”: “BigBook Pub”,
“Title”: “This is my first BigBook title”,
“Type”: “fiction”
}
]

My code (which ill show shortly) generates the following aggregation definition ($search, $project and $facet)

[
	{
		"$search": {
			"facet": {
				"operator": {
					"compound": {
						"should": [
							{
								"text": {
									"query": "Jon West",
									"path": [
										"Title",
										"Publisher",
										"Description"
									]
								}
							}
						]
					}
				},
				"facets": {
					"publisherFacet": {
						"type": "string",
						"path": "Publisher"
					},
					"typeFacet": {
						"type": "string",
						"path": "Type"
					}
				}
			},
			"index": "my-index"
		}
	},
	{
		"$project": {
			"_id": 1,
			"Publisher": 1,
			"Title": 1,
			"Description": 1
		}
	},
	{
		"$facet": {
			"docs": [
				{
					"$project": {
						"_id": 1,
						"Publisher": 1,
						"Title": 1,
						"Description": 1
					}
				}
			]
		}
	}
]

From the above you can see that it is generating the $facet aggregation ($facet/docs/$project) which is similar to the definition in the atlas documentation, but im unable to work out how to generate section “$facet/meta/$replaceWith” as in the documentation

The Code that produced the above aggregation definition is as follows. It was simplfied for brevity. You will see a commented out bit where i was trying to generate the “{“$replaceWith”: “$$SEARCH_META”}” but without successful. How do i generate this section?

public IEnumerable<Book> Search<T>(IMongoCollection<Book> collection)
        {
            var aggregateStage = collection.Aggregate();
    
            #region $search Aggregation Stage
                var compoundSearchDefinition = Builders<Book>.Search.Compound();
                compoundSearchDefinition.Should(Builders<Book>.Search.Text(listOfSearchableFields, 'Jon West'));
    
    
                var myFacets = new List<SearchFacet<Book>>
                {
                    Builders<Book>.SearchFacet.String("publisherFacet", "Publisher"),
                    Builders<Book>.SearchFacet.String("typeFacet", "Type")
                };
                var searchAndFacetDefinition = Builders<Book>.Search.Facet(compoundSearchDefinition, facets: myFacets);
    
    
                var textSearchResult = aggregateStage.Search(
                    searchAndFacetDefinition,
                    indexName: searchIndexSettings.Value.BookIndexName);
    
    
                var projectionDefinition = new ProjectionDefinitionBuilder<Book>()
                    .Include(clip => clip.Id)
                    .Include(clip => clip.Publisher)
                    .Include(clip => clip.Title)
                    .Include(clip => clip.Description);
    
                var searchAggregateStage = textSearchResult.Project<Book>(projectionDefinition);
            #endregion
    
    
    
    
            #region $facet Aggregation Stage
                PipelineDefinition<Book, Book> projectPipelineDef = new EmptyPipelineDefinition<Book>();
                PipelineDefinition<Book, Book> metaPipelineDef = new EmptyPipelineDefinition<Book>();
    
    
                ProjectionDefinition<Book, Book> projection1 = Builders<Book>.Projection
                    .Include(clip => clip.Id)
                    .Include(clip => clip.Publisher)
                    .Include(clip => clip.Title)
                    .Include(clip => clip.Description);
    
    
    
                var projDef = projectPipelineDef.Project(projection1);
                //  var metaDef = metaPipelineDef.ReplaceWith("$$SEARCH_META");
    
                var aggregateFacet1 = AggregateFacet.Create("docs", projDef);
                //var aggregateFacet2 = AggregateFacet.Create("meta", metaDef);
    
                var aggregateFacetList = new List<AggregateFacet<Book>>()
                {
                    aggregateFacet1,
                //    aggregateFacet2
                };
    
                
                var facetAggregateFluent = searchAggregateStage.Facet(aggregateFacetList);
            #endregion
    
    
            var result1 = facetAggregateFluent.ToList()[0].Facets[0].Output<Book>();
            return result1;
        }

And the Book Class

public class Book
{
public bool Published { get; set; }
public string Description { get; set; }
public string Publisher { get; set; }
public string Title { get; set; }
public string Type { get; set; }
}

1 Like