Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

Sintaxis LINQ para operaciones de agregación

En esta guía, puedes aprender a usar LINQ con el Controlador MongoDB .NET/C#. LINQ te permite construir consultas sobre colecciones de objetos fuertemente tipados mediante el uso de palabras clave y operadores del lenguaje. El controlador .NET/C# traduce automáticamente las consultas LINQ en operaciones de agregación.

Importante

LINQ3 es el único proveedor LINQ disponible en el controlador de MongoDB para .NET/C#. Si ha configurado manualmente su proyecto para usar LINQ2, no se compilará.

Los ejemplos de esta guía utilizan el restaurants colección en la base de datos sample_restaurants proporcionada en los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulta Comience con el controlador .NET/C#.

Las siguientes clases Restaurant, Address y GradeEntry representan los documentos de esta colección:

public class Restaurant
{
public ObjectId Id { get; set; }
public string Name { get; set; }
[BsonElement("restaurant_id")]
public string RestaurantId { get; set; }
public string Cuisine { get; set; }
public Address Address { get; set; }
public string Borough { get; set; }
public List<GradeEntry> Grades { get; set; }
}
public class Address
{
public string Building { get; set; }
[BsonElement("coord")]
public double[] Coordinates { get; set; }
public string Street { get; set; }
[BsonElement("zipcode")]
public string ZipCode { get; set; }
}
public class GradeEntry
{
public DateTime Date { get; set; }
public string Grade { get; set; }
public float Score { get; set; }
}

Nota

Los documentos de la colección restaurants utilizan la convención de nomenclatura snake-case. Los ejemplos de esta guía utilizan un ConventionPack para deserializar los campos de la colección en notación Pascal y asignarlos a las propiedades de la clase Restaurant.

Para aprender más sobre la serialización personalizada, consultar Serialización personalizada.

Para usar LINQ para consultar tu colección, primero debes crear un objeto IQueryable que enlace a la colección. Para crear el objeto, utiliza el método AsQueryable() de la siguiente manera:

var restaurantsDatabase = client.GetDatabase("sample_restaurants");
var restaurantsCollection = restaurantsDatabase.GetCollection<Restaurant>("restaurants");
var queryableCollection = restaurantsCollection.AsQueryable();

Una vez que tengas el objeto consultable, puedes componer una query utilizando la sintaxis de método. Algunas etapas del pipeline también admiten la sintaxis de comprensión de query, que se asemeja a la sintaxis de query SQL.

Selecciona el Method Syntax o la pestaña Query Syntax para ver cómo componer una consulta utilizando LINQ:

var query = queryableCollection
.Where(r => r.Name == "The Movable Feast")
.Select(r => new { r.Name, r.Address });
var query = from r in queryableCollection
where r.Name == "The Movable Feast"
select new { r.Name, r.Address };

Puedes imprimir los resultados del ejemplo anterior de la siguiente manera:

foreach (var restaurant in query)
{
Console.WriteLine(restaurant.ToJson());
}
{ "name" : "The Movable Feast", "address" : { "building" : "284", "coord" : [-73.982923900000003, 40.6580753], "street" : "Prospect Park West", "zipcode" : "11215" } }

Tip

Acceso a los resultados de la consulta

También puedes acceder a los resultados de tu query utilizando los métodos ToList() o ToCursor():

var results = query.ToList();
var results = query.ToCursor();

Puedes usar LINQ para crear un pipeline de agregación. El .NET/C# Driver traduce automáticamente cada instrucción LINQ en las etapas correspondientes del pipeline de agregación. En esta sección puedes aprender qué etapas del pipeline de agregación son compatibles.

Para obtener más información sobre las etapas del pipeline de agregación, consulta Etapas de Agregación en el manual de MongoDB Server.

La etapa de agregación $project devuelve un documento que contiene solo los campos especificados.

Selecciona la pestaña Method Syntax o Query Syntax para ver cómo generar una etapa $project usando LINQ:

var query = queryableCollection
.Select(r => new { r.Name, r.Address });
var query = from r in queryableCollection
select new { r.Name, r.Address };

El resultado del ejemplo anterior contiene el siguiente documento:

{ "name" : "The Movable Feast", "address" : { "building" : "284", "coord" : [-73.982923900000003, 40.6580753], "street" : "Prospect Park West", "zipcode" : "11215" } }

Nota

Excluyendo el campo _id

Si no incluye el campo _id en su proyección LINQ, el controlador de .NET/C# lo excluye automáticamente de los resultados.

La etapa de agregación de $match devuelve los documentos que cumplen con un criterio especificado.

Selecciona la pestaña Method Syntax o Query Syntax para ver cómo generar una etapa $match usando LINQ:

var query = queryableCollection
.Where(r => r.Name == "The Movable Feast");
var query = from r in queryableCollection
where r.Name == "The Movable Feast"
select r;

El resultado del ejemplo anterior contiene el siguiente documento:

// Results Truncated
{ "_id" : ObjectId(...), "name" : "The Movable Feast", "restaurant_id" : "40361606", "cuisine" : "American", "address" : {...}, "borough" : "Brooklyn", "grades" : [...] }

La etapa de agregación $limit limita el número de documentos que devuelve la query. El siguiente ejemplo muestra cómo generar una etapa $limit usando LINQ:

var query = queryableCollection
.Where(r => r.Cuisine == "Italian")
.Select(r => new {r.Name, r.Cuisine})
.Take(5);

El resultado del ejemplo anterior contiene los siguientes documentos:

{ "name" : "Philadelhia Grille Express", "cuisine" : "Italian" }
{ "name" : "Isle Of Capri Resturant", "cuisine" : "Italian" }
{ "name" : "Marchis Restaurant", "cuisine" : "Italian" }
{ "name" : "Crystal Room", "cuisine" : "Italian" }
{ "name" : "Forlinis Restaurant", "cuisine" : "Italian" }

Puedes usar el método LINQ TakeWhile() en una proyección Select() para devolver elementos de un campo de arreglo mientras una condición especificada sea verdadera y luego omitir los elementos restantes.

Este ejemplo utiliza la siguiente clase Student para modelar documentos que contienen un campo de arreglo Grades:

public class Student
{
public ObjectId Id { get; set; }
public string Name { get; set; }
public int[] Grades { get; set; }
}

El siguiente código muestra cómo usar el método TakeWhile() para devolver cualquier elemento de Grades arreglo que sea mayor que 90 y omitir el resto del arreglo:

var query = queryableCollection
.Select(s => s.Grades.TakeWhile(g => g > 90).ToArray());

Los resultados pueden parecerse a los siguientes arreglos:

[92, 97]
[100, 95, 91]

La etapa de agregación $sample devuelve una muestra aleatoria de documentos de una colección. El siguiente ejemplo muestra cómo generar una etapa $sample usando LINQ:

var query = queryableCollection
.Aggregate()
.Sample(4)
.ToList();

El resultado del ejemplo anterior contiene los siguientes documentos:

// Results Truncated
{ "name" : "Von Dolhens", "cuisine" : "Ice Cream, Gelato, Yogurt, Ices" }
{ "name" : "New York Mercantile Exchange", "cuisine" : "American" }
{ "name" : "Michaelangelo's Restaurant", "cuisine" : "Italian" }
{ "name" : "Charlie Palmer Steak", "cuisine" : "American" }

La etapa de agregación de $skip omite un número especificado de documentos devueltos por una consulta y luego devuelve el resto de los resultados. El siguiente ejemplo muestra cómo generar una etapa $skip usando LINQ:

var query = queryableCollection
.Where(r => r.Cuisine == "Italian")
.Select(r => new {r.Name, r.Cuisine})
.Skip(2);

El ejemplo anterior omite los dos primeros restaurantes que coinciden con los criterios y devuelve el resto. El resultado contiene los siguientes documentos:

// Results Truncated
{ "name" : "Marchis Restaurant", "cuisine" : "Italian" }
{ "name" : "Crystal Room", "cuisine" : "Italian" }
{ "name" : "Forlinis Restaurant", "cuisine" : "Italian" }
...

Se puede utilizar el método LINQ SkipWhile() en una proyección Select() para omitir los elementos de campo del arreglo mientras se cumpla una condición específica, y luego devolver los elementos restantes.

Este ejemplo utiliza la siguiente clase Student para modelar documentos que contienen un campo de arreglo Grades:

public class Student
{
public ObjectId Id { get; set; }
public string Name { get; set; }
public int[] Grades { get; set; }
}

El siguiente código muestra cómo usar el método SkipWhile() para omitir cualquier elemento del arreglo Grades que sea menor que 75 y devolver el resto del arreglo:

var query = queryableCollection
.Select(s => s.Grades.SkipWhile(g => g < 75).ToArray());

Los resultados pueden parecerse a los siguientes arreglos:

[80, 90, 70, 83]
[79, 100, 85, 73]

La etapa de agregación $unwind deconstruye un campo de arreglo especificado y devuelve un documento para cada elemento de ese arreglo.

Seleccione la pestaña Method Syntax o Query Syntax para ver cómo generar una fase $unwind usando LINQ:

var query = queryableCollection
.Where(r => r.Name == "The Movable Feast")
.SelectMany(r => r.Grades);
var query = from r in queryableCollection
where r.Name == "The Movable Feast"
from grade in r.Grades
select grade;

La query en el ejemplo anterior encuentra el documento en el que el campo Name tiene el valor "The Movable Feast". Luego, para cada elemento en el arreglo Grades de este documento, la query devuelve un nuevo documento. El resultado contiene los siguientes documentos:

{ "date" : ISODate("2014-11-19T00:00:00Z"), "grade" : "A", "score" : 11 }
{ "date" : ISODate("2013-11-14T00:00:00Z"), "grade" : "A", "score" : 2 }
{ "date" : ISODate("2012-12-05T00:00:00Z"), "grade" : "A", "score" : 13 }
{ "date" : ISODate("2012-05-17T00:00:00Z"), "grade" : "A", "score" : 11 }

Puedes encadenar o anidar instrucciones Select y SelectMany para deshacer arreglos anidados. Considera una colección que contiene documentos con un nuevo esquema. Estos documentos contienen un restaurants campo, que contiene un arreglo de documentos representados por la Restaurant clase. Los documentos dentro del arreglo tienen cada uno un campo grades que contiene un arreglo de documentos representados por la clase Grade. El siguiente código es un ejemplo de un solo documento de esta colección:

{
"_id": { "$oid": ... },
"restaurants": [
{
"_id": { ... } ,
"address": { ... },
"name": "Tov Kosher Kitchen",
"grades": [
{
"date" : ISODate("2014-11-24T00:00:00Z"),
"grade" : "Z",
"score" : 20.0
},
{
"date" : ISODate("2013-01-17T00:00:00Z"),
"grade" : "A",
"score" : 13.0
}
]
...
},
{
"_id": { ... } ,
"address": { ... },
"name": "Harriet's Kitchen",
"grades": [
{
"date" : ISODate("2014-04-19T00:00:00Z"),
"grade" : "B",
"score" : 12.0
}
],
...
},
...
]
}

Puedes anidar SelectMany instrucciones dentro de SelectMany o Select instrucciones. El siguiente ejemplo anida una instrucción SelectMany dentro de una instrucción Select para recuperar un arreglo de cada documento en la colección. Cada arreglo contiene todos los objetos de calificación de todos los restaurantes en cada documento.

var query = queryableCollection
.Select(r => r.Restaurants.SelectMany(r => r.Grades));
// output for first document in collection
[
{ "date" : ISODate("2014-11-24T00:00:00Z"),
"grade" : "Z",
"score" : 20.0
},
{ "date" : ISODate("2013-01-17T00:00:00Z"),
"grade" : "A",
"score" : 13.0
},
{
"date" : ISODate("2014-04-19T00:00:00Z"),
"grade" : "B",
"score" : 12.0
},
...
],
// output for second document in collection
[
...
]

La etapa de agregación $group separa los documentos en grupos según los criterios que se especifiquen.

Selecciona la pestaña Method Syntax o Query Syntax para ver cómo generar una etapa $group usando LINQ:

var query = queryableCollection
.GroupBy(r => r.Cuisine)
.Select(g => new { Cuisine = g.Key, Count = g.Count() });
var query = from r in queryableCollection
group r by r.Cuisine into g
select new {Cuisine = g.Key, Count = g.Count()};

El ejemplo anterior agrupa cada documento por el valor de su campo Cuisine y luego cuenta cuántos documentos tienen cada valor Cuisine. El resultado contiene los siguientes documentos:

// Results Truncated
{ "cuisine" : "Caribbean", "count" : 657 }
{ "cuisine" : "Café/Coffee/Tea", "count" : 1214 }
{ "cuisine" : "Iranian", "count" : 2 }
{ "cuisine" : "Nuts/Confectionary", "count" : 6 }
{ "cuisine" : "Middle Eastern", "count" : 168 }
...

Nota

Orden de resultados

Las consultas anteriores no siempre devuelven resultados en el mismo orden. Ejecutar este ejemplo puede devolver los resultados en un orden diferente al que se muestra arriba.

La etapa de agregación $sort devuelve los resultados de tu query en el orden que especificaste.

Selecciona la pestaña Method Syntax o Query Syntax para ver cómo generar una etapa $sort usando LINQ:

var query = queryableCollection
.OrderBy(r => r.Name)
.ThenByDescending(r => r.RestaurantId);
var query = from r in queryableCollection
orderby r.Name, r.RestaurantId descending
select r;

El ejemplo anterior devuelve los resultados de la query ordenados alfabéticamente por el campo Name, con una ordenación secundaria descendente en el campo RestaurantId. A continuación se muestra un subconjunto de los documentos contenidos en los resultados devueltos:

// Results Truncated
...
{ "_id" : ObjectId(...), "name" : "Aba Turkish Restaurant", "restaurant_id" : "41548686", "cuisine" : "Turkish", "address" : {...}, "borough" : "Manhattan", "grades" : [...] }
{ "_id" : ObjectId(...), "name" : "Abace Sushi", "restaurant_id" : "50006214", "cuisine" : "Japanese", "address" : { ... }, "borough" : "Manhattan", "grades" : [...] }
{ "_id" : ObjectId(...), "name" : "Abacky Potluck", "restaurant_id" : "50011222", "cuisine" : "Asian", "address" : { ... }, "borough" : "Manhattan", "grades" : [...] }
{ "_id" : ObjectId(...), "name" : "Abaleh", "restaurant_id" : "50009096", "cuisine" : "Mediterranean", "address" : { ... }, "borough" : "Manhattan", "grades" : [...] }
...

La etapa de agregación $lookup une documentos de una colección con documentos de otra colección en la misma base de datos. La etapa $lookup agrega un nuevo campo de arreglo en cada documento de entrada. El nuevo campo de arreglo contiene los documentos coincidentes de la colección "vinculada".

Considera una segunda colección en la base de datos sample_restaurants llamada reviews que tiene revisiones de restaurantes. Puedes unir documentos de esa colección a documentos con el mismo valor de name en la colección restaurants usando la etapa $lookup.

La siguiente clase Review modela los documentos en la colección reviews:

public class Review
{
public ObjectId Id { get; set; }
[BsonElement("restaurant_name")]
public string RestaurantName { get; set; }
public string Reviewer { get; set; }
[BsonElement("review_text")]
public string ReviewText { get; set; }
}

Puedes especificar una etapa $lookup llamando al método Lookup() o al método GroupJoin(). Las siguientes secciones muestran cómo realizar un $lookup utilizando cada método.

El siguiente código especifica una etapa de $lookup utilizando el método Lookup(). Este ejemplo une documentos de la colección reviews a documentos de la colección restaurants donde el campo RestaurantName en la colección reviews coincide con el campo Name en la colección restaurants:

var lookupResult = restaurantsCollection.AsQueryable()
.Lookup(reviewCollection,
restaurant => restaurant.Name,
review => review.RestaurantName);

El ejemplo anterior devuelve una lista de LookupResult objetos que cada uno contiene un documento combinado. Para aprender más sobre la clase LookupResult, consulta la documentación de LookupResult API.

También puede usar una sobrecarga de método Lookup() para especificar criterios adicionales para la unión. El siguiente ejemplo une documentos de la colección restaurants a documentos de la colección reviews donde el campo RestaurantName en la colección reviews coincide con el campo Name en la colección restaurants y el campo ReviewText en la colección reviews contiene el nombre del restaurante.

var lookupResult = restaurantsCollection.AsQueryable()
.Lookup(reviewCollection,
(restaurant, reviews) => reviews
.Where(review => review.ReviewText.Contains(restaurant.Name)));

Para ver una lista completa de sobrecargas para el método Lookup(), consulta la documentación de la API de búsqueda.

Puedes especificar una etapa $lookup usando el método LINQ GroupJoin(). Para realizar una búsqueda GroupJoin(), debes hacer que ambas colecciones sean consultables utilizando el método AsQueryable(). Para aprender a hacer que una colección pueda ser consultada, consulta Hacer que una colección sea consultable.

Selecciona la pestaña Method Syntax o Query Syntax para ver cómo generar una etapa $lookup usando LINQ:

var query = queryableCollection
.GroupJoin(reviewCollection,
restaurant => restaurant.Name,
review => review.RestaurantName,
(restaurant, reviews) =>
new { Restaurant = restaurant, Reviews = reviews }
);
var query = from restaurant in queryableCollection
join rv in reviewCollection on restaurant.Name equals rv.RestaurantName into reviews
select new { restaurant, reviews };

El ejemplo anterior devuelve todos los documentos de la colección restaurants. Cada documento de restaurante tiene un campo adicional llamado reviews, que contiene todas las revisiones de ese restaurante. Una revisión coincide con un restaurante si el valor del campo name en el documento de la revisión coincide con el campo name del documento del restaurante.

Se muestra un subconjunto de los resultados devueltos:

// Results Truncated
{
"restaurant": {
"_id": ObjectId("..."),
"name": "The Movable Feast",
"restaurant_id": "40361606",
"cuisine": "American",
"address": { ... },
"borough": "Brooklyn",
"grades": [ ... ]
},
"reviews": [
{
"_id": ObjectId("..."),
"restaurant_name": "The Movable Feast",
"reviewer": "Lazlo Cravensworth",
"review_text": "Great restaurant! 12/10 stars!"
},
{
"_id": ObjectId("..."),
"restaurant_name": "The Movable Feast",
"reviewer": "Michael Scarn",
"review_text": "It really was a feast"
}
]
}

La etapa de agregación $search realiza una búsqueda de texto completo en campos de una colección. Debes definir un índice MongoDB Search en el campo antes de poder realizar una operación $search en tus datos.

Para crear el índice de búsqueda de MongoDB que necesitas para el siguiente ejemplo, ejecuta el siguiente código en la colección restaurants:

var index = new CreateSearchIndexModel(
"default", new BsonDocument
{
{ "mappings", new BsonDocument
{
{ "dynamic", true }
}
}
});
var result = collection.SearchIndexes.CreateOne(index);

Para crear una etapa de pipeline $search, utiliza el método Search(). El método Search() acepta SearchDefinition y SearchOptions objetos como parámetros. El objeto SearchDefinition contiene el campo a buscar y el valor a buscar. Puedes utilizar el objeto SearchOptions para configurar tu operación de búsqueda.

El siguiente código muestra cómo usar LINQ para crear una etapa de $search pipeline que realiza las siguientes operaciones:

  • Busca documentos donde el campo Name contiene "Deli" utilizando el índice de búsqueda default

  • Devuelve los campos Name y Cuisine de los documentos de restaurantes coincidentes

var searchOptions = new SearchOptions<Restaurant>()
{
IndexName = "default"
};
var searchDefinition = Builders<Restaurant>.Search
.Text(x => x.Name, "Deli");
var results = queryableCollection
.Search(searchDefinition, searchOptions)
.Select(m => new { m.Name, m.Cuisine });

Los resultados del ejemplo anterior contienen los siguientes documentos:

// Results Truncated
{ "Name" : "Mexico Lindo Y ! Q Rico! Deli", "Cuisine" : "Mexican" }
{ "Name" : "Cold Cut City Bunny Deli 2", "Cuisine" : "American" }
{ "Name" : "Blue Moon Chicken Deli & Pizza Corp", "Cuisine" : "Other" }
{ "Name" : "Little Michaels Deli And Sald Bar", "Cuisine" : "Delicatessen" }
{ "Name" : "La Esperanza Mexican Deli Grocery & Vegetables", "Cuisine" : "Mexican" }
{ "Name" : "El Sol De Mexico Deli Grocery", "Cuisine" : "Mexican" }
{ "Name" : "C & C Deli Coffee Shop & Pastry", "Cuisine" : "Delicatessen" }
{ "Name" : "Jennis Deli And Grill And Grocery", "Cuisine" : "Spanish" }
{ "Name" : "La Nueva Estrella Pizza And Deli Grocery", "Cuisine" : "Spanish" }
{ "Name" : "Blue Cafe/3 In 1 Deli Restaurant", "Cuisine" : "American" }

Para obtener más información sobre MongoDB Search, los índices de MongoDB Search y cómo incorporarlos a su aplicación, consulte Descripción general de MongoDB Search en el manual de Atlas.

La etapa de agregación $vectorSearch realiza una búsqueda de ANN en un vector en el campo especificado. Su colección debe tener un índice de MongoDB Vector Search definido antes de poder realizar una búsqueda vectorial en sus datos.

Tip

Para obtener el conjunto de datos de muestra utilizado en el siguiente ejemplo, consulta Empezar con el Driver .NET/C#. Para crear el índice de búsqueda vectorial de MongoDB de muestra utilizado en el siguiente ejemplo, consulta Crear un índice de búsqueda vectorial de MongoDB en el manual de Atlas.

Para crear una etapa de $vectorSearch en la pipeline, llama al método VectorSearch() en un objeto PipelineStageDefinitionBuilder. El método VectorSearch() acepta los siguientes parámetros:

Parameter
Descripción

field

El campo en el que realizar la búsqueda vectorial.

Tipo de datos: Expression<Func<TInput, TField>>

queryVector

El vector codificado que se emparejará con valores de la base de datos. Aunque el tipo de dato de este parámetro es QueryVector, también se puede pasar un arreglo de valores de float.

Tipo de dato: QueryVector

limit

El número máximo de documentos para devolver.

Tipo de datos: integer

options

Opciones de configuración para la operación de búsqueda vectorial.

Tipo de dato: VectorSearchOptions<TDocument>

Puede usar el parámetro options para configurar su operación de búsqueda vectorial. La clase VectorSearchOptions contiene las siguientes propiedades:

Propiedad
Descripción

Exact

Si la búsqueda vectorial utiliza el algoritmo de vecino más cercano exacto (ENN). Si esta propiedad está configurada en false, la búsqueda vectorial utiliza el algoritmo de ANN (ANN). Si esta propiedad está configurada en true, la propiedad NumberOfCandidates debe ser null.

Data type: boolean
Default: false

Filter

Parámetros de búsqueda adicionales que los documentos encontrados deben cumplir.

Default: null

IndexName

El índice para realizar la búsqueda vectorial.

Data type: string
Default: null

NumberOfCandidates

El número de vecinos a buscar en el índice.

Data type: int?
Default: null

ReturnStoredSource

Si se establece en true, la búsqueda vectorial solo devuelve los campos almacenados en el índice, en lugar de recuperar documentos completos de la colección. Utiliza esta opción para mejorar el rendimiento de la query cuando solo se necesita un subconjunto de campos de documentos.

Data type: bool
Default: false

Considera la colección embedded_movies en la base de datos sample_mflix. La siguiente clase EmbeddedMovie representa un documento en esta base de datos:

[BsonIgnoreExtraElements]
public class EmbeddedMovie
{
public ObjectId Id { get; set; }
public string Plot { get; set; }
public string Title { get; set; }
[BsonElement("plot_embedding")]
public float[] PlotEmbedding { get; set; }
}

Se puede utilizar una etapa $vectorSearch para realizar una búsqueda semántica en el campo plot_embedding de los documentos de la colección. El siguiente ejemplo muestra cómo usar LINQ para generar un pipeline de agregación para realizar las siguientes operaciones:

  • Realiza una búsqueda vectorial en el índice de MongoDB Vector Search del campo plot_embedding utilizando incrustaciones vectoriales para la string "time travel"

  • Obtén los campos Title y Plot de los documentos encontrados en la búsqueda vectorial

// Defines vector embeddings for the string "time travel"
var vector = new[] {-0.0016261312,-0.028070757,-0.011342932,-0.012775794,-0.0027440966,0.008683807,-0.02575152,-0.02020668,-0.010283281,-0.0041719596,0.021392956,0.028657231,-0.006634482,0.007490867,0.018593878,0.0038187427,0.029590257,-0.01451522,0.016061379,0.00008528442,-0.008943722,0.01627464,0.024311995,-0.025911469,0.00022596726,-0.008863748,0.008823762,-0.034921836,0.007910728,-0.01515501,0.035801545,-0.0035688248,-0.020299982,-0.03145631,-0.032256044,-0.028763862,-0.0071576433,-0.012769129,0.012322609,-0.006621153,0.010583182,0.024085402,-0.001623632,0.007864078,-0.021406285,0.002554159,0.012229307,-0.011762793,0.0051682983,0.0048484034,0.018087378,0.024325324,-0.037694257,-0.026537929,-0.008803768,-0.017767483,-0.012642504,-0.0062712682,0.0009771782,-0.010409906,0.017754154,-0.004671795,-0.030469967,0.008477209,-0.005218282,-0.0058480743,-0.020153364,-0.0032805866,0.004248601,0.0051449724,0.006791097,0.007650814,0.003458861,-0.0031223053,-0.01932697,-0.033615597,0.00745088,0.006321252,-0.0038154104,0.014555207,0.027697546,-0.02828402,0.0066711367,0.0077107945,0.01794076,0.011349596,-0.0052715978,0.014755142,-0.019753495,-0.011156326,0.011202978,0.022126047,0.00846388,0.030549942,-0.0041386373,0.018847128,-0.00033655585,0.024925126,-0.003555496,-0.019300312,0.010749794,0.0075308536,-0.018287312,-0.016567878,-0.012869096,-0.015528221,0.0078107617,-0.011156326,0.013522214,-0.020646535,-0.01211601,0.055928253,0.011596181,-0.017247654,0.0005939711,-0.026977783,-0.003942035,-0.009583511,-0.0055248477,-0.028737204,0.023179034,0.003995351,0.0219661,-0.008470545,0.023392297,0.010469886,-0.015874773,0.007890735,-0.009690142,-0.00024970944,0.012775794,0.0114762215,0.013422247,0.010429899,-0.03686786,-0.006717788,-0.027484283,0.011556195,-0.036068123,-0.013915418,-0.0016327957,0.0151016945,-0.020473259,0.004671795,-0.012555866,0.0209531,0.01982014,0.024485271,0.0105431955,-0.005178295,0.033162415,-0.013795458,0.007150979,0.010243294,0.005644808,0.017260984,-0.0045618312,0.0024725192,0.004305249,-0.008197301,0.0014203656,0.0018460588,0.005015015,-0.011142998,0.01439526,0.022965772,0.02552493,0.007757446,-0.0019726837,0.009503538,-0.032042783,0.008403899,-0.04609149,0.013808787,0.011749465,0.036388017,0.016314628,0.021939443,-0.0250051,-0.017354285,-0.012962398,0.00006107364,0.019113706,0.03081652,-0.018114036,-0.0084572155,0.009643491,-0.0034721901,0.0072642746,-0.0090636825,0.01642126,0.013428912,0.027724205,0.0071243206,-0.6858542,-0.031029783,-0.014595194,-0.011449563,0.017514233,0.01743426,0.009950057,0.0029706885,-0.015714826,-0.001806072,0.011856096,0.026444625,-0.0010663156,-0.006474535,0.0016161345,-0.020313311,0.0148351155,-0.0018393943,0.0057347785,0.018300641,-0.018647194,0.03345565,-0.008070676,0.0071443142,0.014301958,0.0044818576,0.003838736,-0.007350913,-0.024525259,-0.001142124,-0.018620536,0.017247654,0.007037683,0.010236629,0.06046009,0.0138887605,-0.012122675,0.037694257,0.0055081863,0.042492677,0.00021784494,-0.011656162,0.010276617,0.022325981,0.005984696,-0.009496873,0.013382261,-0.0010563189,0.0026507939,-0.041639622,0.008637156,0.026471283,-0.008403899,0.024858482,-0.00066686375,-0.0016252982,0.027590916,0.0051449724,0.0058647357,-0.008743787,-0.014968405,0.027724205,-0.011596181,0.0047650975,-0.015381602,0.0043718936,0.002159289,0.035908177,-0.008243952,-0.030443309,0.027564257,0.042625964,-0.0033688906,0.01843393,0.019087048,0.024578573,0.03268257,-0.015608194,-0.014128681,-0.0033538956,-0.0028757197,-0.004121976,-0.032389335,0.0034322033,0.058807302,0.010943064,-0.030523283,0.008903735,0.017500903,0.00871713,-0.0029406983,0.013995391,-0.03132302,-0.019660193,-0.00770413,-0.0038853872,0.0015894766,-0.0015294964,-0.006251275,-0.021099718,-0.010256623,-0.008863748,0.028550599,0.02020668,-0.0012962399,-0.003415542,-0.0022509254,0.0119360695,0.027590916,-0.046971202,-0.0015194997,-0.022405956,0.0016677842,-0.00018535563,-0.015421589,-0.031802863,0.03814744,0.0065411795,0.016567878,-0.015621523,0.022899127,-0.011076353,0.02841731,-0.002679118,-0.002342562,0.015341615,0.01804739,-0.020566562,-0.012989056,-0.002990682,0.01643459,0.00042527664,0.008243952,-0.013715484,-0.004835075,-0.009803439,0.03129636,-0.021432944,0.0012087687,-0.015741484,-0.0052016205,0.00080890034,-0.01755422,0.004811749,-0.017967418,-0.026684547,-0.014128681,0.0041386373,-0.013742141,-0.010056688,-0.013268964,-0.0110630235,-0.028337335,0.015981404,-0.00997005,-0.02424535,-0.013968734,-0.028310679,-0.027750863,-0.020699851,0.02235264,0.001057985,0.00081639783,-0.0099367285,0.013522214,-0.012016043,-0.00086471526,0.013568865,0.0019376953,-0.019020405,0.017460918,-0.023045745,0.008503866,0.0064678704,-0.011509543,0.018727167,-0.003372223,-0.0028690554,-0.0027024434,-0.011902748,-0.012182655,-0.015714826,-0.0098634185,0.00593138,0.018753825,0.0010146659,0.013029044,0.0003521757,-0.017620865,0.04102649,0.00552818,0.024485271,-0.009630162,-0.015608194,0.0006718621,-0.0008418062,0.012395918,0.0057980907,0.016221326,0.010616505,0.004838407,-0.012402583,0.019900113,-0.0034521967,0.000247002,-0.03153628,0.0011038032,-0.020819811,0.016234655,-0.00330058,-0.0032289368,0.00078973995,-0.021952773,-0.022459272,0.03118973,0.03673457,-0.021472929,0.0072109587,-0.015075036,0.004855068,-0.0008151483,0.0069643734,0.010023367,-0.010276617,-0.023019087,0.0068244194,-0.0012520878,-0.0015086699,0.022046074,-0.034148756,-0.0022192693,0.002427534,-0.0027124402,0.0060346797,0.015461575,0.0137554705,0.009230294,-0.009583511,0.032629255,0.015994733,-0.019167023,-0.009203636,0.03393549,-0.017274313,-0.012042701,-0.0009930064,0.026777849,-0.013582194,-0.0027590916,-0.017594207,-0.026804507,-0.0014236979,-0.022032745,0.0091236625,-0.0042419364,-0.00858384,-0.0033905501,-0.020739838,0.016821127,0.022539245,0.015381602,0.015141681,0.028817179,-0.019726837,-0.0051283115,-0.011489551,-0.013208984,-0.0047017853,-0.0072309524,0.01767418,0.0025658219,-0.010323267,0.012609182,-0.028097415,0.026871152,-0.010276617,0.021912785,0.0022542577,0.005124979,-0.0019710176,0.004518512,-0.040360045,0.010969722,-0.0031539614,-0.020366628,-0.025778178,-0.0110030435,-0.016221326,0.0036587953,0.016207997,0.003007343,-0.0032555948,0.0044052163,-0.022046074,-0.0008822095,-0.009363583,0.028230704,-0.024538586,0.0029840174,0.0016044717,-0.014181997,0.031349678,-0.014381931,-0.027750863,0.02613806,0.0004136138,-0.005748107,-0.01868718,-0.0010138329,0.0054348772,0.010703143,-0.003682121,0.0030856507,-0.004275259,-0.010403241,0.021113047,-0.022685863,-0.023032416,0.031429652,0.001792743,-0.005644808,-0.011842767,-0.04078657,-0.0026874484,0.06915057,-0.00056939584,-0.013995391,0.010703143,-0.013728813,-0.022939114,-0.015261642,-0.022485929,0.016807798,0.007964044,0.0144219175,0.016821127,0.0076241563,0.005461535,-0.013248971,0.015301628,0.0085171955,-0.004318578,0.011136333,-0.0059047225,-0.010249958,-0.018207338,0.024645219,0.021752838,0.0007614159,-0.013648839,0.01111634,-0.010503208,-0.0038487327,-0.008203966,-0.00397869,0.0029740208,0.008530525,0.005261601,0.01642126,-0.0038753906,-0.013222313,0.026537929,0.024671877,-0.043505676,0.014195326,0.024778508,0.0056914594,-0.025951454,0.017620865,-0.0021359634,0.008643821,0.021299653,0.0041686273,-0.009017031,0.04044002,0.024378639,-0.027777521,-0.014208655,0.0028623908,0.042119466,0.005801423,-0.028124074,-0.03129636,0.022139376,-0.022179363,-0.04067994,0.013688826,0.013328944,0.0046184794,-0.02828402,-0.0063412455,-0.0046184794,-0.011756129,-0.010383247,-0.0018543894,-0.0018593877,-0.00052024535,0.004815081,0.014781799,0.018007403,0.01306903,-0.020433271,0.009043689,0.033189073,-0.006844413,-0.019766824,-0.018767154,0.00533491,-0.0024575242,0.018727167,0.0058080875,-0.013835444,0.0040719924,0.004881726,0.012029372,0.005664801,0.03193615,0.0058047553,0.002695779,0.009290274,0.02361889,0.017834127,0.0049017193,-0.0036388019,0.010776452,-0.019793482,0.0067777685,-0.014208655,-0.024911797,0.002385881,0.0034988478,0.020899786,-0.0025858153,-0.011849431,0.033189073,-0.021312982,0.024965113,-0.014635181,0.014048708,-0.0035921505,-0.003347231,0.030869836,-0.0017161017,-0.0061346465,0.009203636,-0.025165047,0.0068510775,0.021499587,0.013782129,-0.0024475274,-0.0051149824,-0.024445284,0.006167969,0.0068844,-0.00076183246,0.030150073,-0.0055948244,-0.011162991,-0.02057989,-0.009703471,-0.020646535,0.008004031,0.0066378145,-0.019900113,-0.012169327,-0.01439526,0.0044252095,-0.004018677,0.014621852,-0.025085073,-0.013715484,-0.017980747,0.0071043274,0.011456228,-0.01010334,-0.0035321703,-0.03801415,-0.012036037,-0.0028990454,-0.05419549,-0.024058744,-0.024272008,0.015221654,0.027964126,0.03182952,-0.015354944,0.004855068,0.011522872,0.004771762,0.0027874154,0.023405626,0.0004242353,-0.03132302,0.007057676,0.008763781,-0.0027057757,0.023005757,-0.0071176565,-0.005238275,0.029110415,-0.010989714,0.013728813,-0.009630162,-0.029137073,-0.0049317093,-0.0008630492,-0.015248313,0.0043219104,-0.0055681667,-0.013175662,0.029723546,0.025098402,0.012849103,-0.0009996708,0.03118973,-0.0021709518,0.0260181,-0.020526575,0.028097415,-0.016141351,0.010509873,-0.022965772,0.002865723,0.0020493253,0.0020509914,-0.0041419696,-0.00039695262,0.017287642,0.0038987163,0.014795128,-0.014661839,-0.008950386,0.004431874,-0.009383577,0.0012604183,-0.023019087,0.0029273694,-0.033135757,0.009176978,-0.011023037,-0.002102641,0.02663123,-0.03849399,-0.0044152127,0.0004527676,-0.0026924468,0.02828402,0.017727496,0.035135098,0.02728435,-0.005348239,-0.001467017,-0.019766824,0.014715155,0.011982721,0.0045651635,0.023458943,-0.0010046692,-0.0031373003,-0.0006972704,0.0019043729,-0.018967088,-0.024311995,0.0011546199,0.007977373,-0.004755101,-0.010016702,-0.02780418,-0.004688456,0.013022379,-0.005484861,0.0017227661,-0.015394931,-0.028763862,-0.026684547,0.0030589928,-0.018513903,0.028363993,0.0044818576,-0.009270281,0.038920518,-0.016008062,0.0093902415,0.004815081,-0.021059733,0.01451522,-0.0051583014,0.023765508,-0.017874114,-0.016821127,-0.012522544,-0.0028390652,0.0040886537,0.020259995,-0.031216389,-0.014115352,-0.009176978,0.010303274,0.020313311,0.0064112223,-0.02235264,-0.022872468,0.0052449396,0.0005723116,0.0037321046,0.016807798,-0.018527232,-0.009303603,0.0024858483,-0.0012662497,-0.007110992,0.011976057,-0.007790768,-0.042999174,-0.006727785,-0.011829439,0.007024354,0.005278262,-0.017740825,-0.0041519664,0.0085905045,0.027750863,-0.038387362,0.024391968,0.00087721116,0.010509873,-0.00038508154,-0.006857742,0.0183273,-0.0037054466,0.015461575,0.0017394272,-0.0017944091,0.014181997,-0.0052682655,0.009023695,0.00719763,-0.013522214,0.0034422,0.014941746,-0.0016711164,-0.025298337,-0.017634194,0.0058714002,-0.005321581,0.017834127,0.0110630235,-0.03369557,0.029190388,-0.008943722,0.009363583,-0.0034222065,-0.026111402,-0.007037683,-0.006561173,0.02473852,-0.007084334,-0.010110005,-0.008577175,0.0030439978,-0.022712521,0.0054582027,-0.0012620845,-0.0011954397,-0.015741484,0.0129557345,-0.00042111133,0.00846388,0.008930393,0.016487904,0.010469886,-0.007917393,-0.011762793,-0.0214596,0.000917198,0.021672864,0.010269952,-0.007737452,-0.010243294,-0.0067244526,-0.015488233,-0.021552904,0.017127695,0.011109675,0.038067464,0.00871713,-0.0025591573,0.021312982,-0.006237946,0.034628596,-0.0045251767,0.008357248,0.020686522,0.0010696478,0.0076708077,0.03772091,-0.018700508,-0.0020676525,-0.008923728,-0.023298996,0.018233996,-0.010256623,0.0017860786,0.009796774,-0.00897038,-0.01269582,-0.018527232,0.009190307,-0.02372552,-0.042119466,0.008097334,-0.0066778013,-0.021046404,0.0019593548,0.011083017,-0.0016028056,0.012662497,-0.000059095124,0.0071043274,-0.014675168,0.024831824,-0.053582355,0.038387362,0.0005698124,0.015954746,0.021552904,0.031589597,-0.009230294,-0.0006147976,0.002625802,-0.011749465,-0.034362018,-0.0067844326,-0.018793812,0.011442899,-0.008743787,0.017474247,-0.021619547,0.01831397,-0.009037024,-0.0057247817,-0.02728435,0.010363255,0.034415334,-0.024032086,-0.0020126705,-0.0045518344,-0.019353628,-0.018340627,-0.03129636,-0.0034038792,-0.006321252,-0.0016161345,0.033642255,-0.000056075285,-0.005005019,0.004571828,-0.0024075406,-0.00010215386,0.0098634185,0.1980148,-0.003825407,-0.025191706,0.035161756,0.005358236,0.025111731,0.023485601,0.0023342315,-0.011882754,0.018287312,-0.0068910643,0.003912045,0.009243623,-0.001355387,-0.028603915,-0.012802451,-0.030150073,-0.014795128,-0.028630573,-0.0013487226,0.002667455,0.00985009,-0.0033972147,-0.021486258,0.009503538,-0.017847456,0.013062365,-0.014341944,0.005078328,0.025165047,-0.015594865,-0.025924796,-0.0018177348,0.010996379,-0.02993681,0.007324255,0.014475234,-0.028577257,0.005494857,0.00011725306,-0.013315615,0.015941417,0.009376912,0.0025158382,0.008743787,0.023832154,-0.008084005,-0.014195326,-0.008823762,0.0033455652,-0.032362677,-0.021552904,-0.0056081535,0.023298996,-0.025444955,0.0097301295,0.009736794,0.015274971,-0.0012937407,-0.018087378,-0.0039387033,0.008637156,-0.011189649,-0.00023846315,-0.011582852,0.0066411467,-0.018220667,0.0060846633,0.0376676,-0.002709108,0.0072776037,0.0034188742,-0.010249958,-0.0007747449,-0.00795738,-0.022192692,0.03910712,0.032122757,0.023898797,0.0076241563,-0.007397564,-0.003655463,0.011442899,-0.014115352,-0.00505167,-0.031163072,0.030336678,-0.006857742,-0.022259338,0.004048667,0.02072651,0.0030156737,-0.0042119464,0.00041861215,-0.005731446,0.011103011,0.013822115,0.021512916,0.009216965,-0.006537847,-0.027057758,-0.04054665,0.010403241,-0.0056281467,-0.005701456,-0.002709108,-0.00745088,-0.0024841821,0.009356919,-0.022659205,0.004061996,-0.013175662,0.017074378,-0.006141311,-0.014541878,0.02993681,-0.00028448965,-0.025271678,0.011689484,-0.014528549,0.004398552,-0.017274313,0.0045751603,0.012455898,0.004121976,-0.025458284,-0.006744446,0.011822774,-0.015035049,-0.03257594,0.014675168,-0.0039187097,0.019726837,-0.0047251107,0.0022825818,0.011829439,0.005391558,-0.016781142,-0.0058747325,0.010309938,-0.013049036,0.01186276,-0.0011246296,0.0062112883,0.0028190718,-0.021739509,0.009883412,-0.0073175905,-0.012715813,-0.017181009,-0.016607866,-0.042492677,-0.0014478565,-0.01794076,0.012302616,-0.015194997,-0.04433207,-0.020606548,0.009696807,0.010303274,-0.01694109,-0.004018677,0.019353628,-0.001991011,0.000058938927,0.010536531,-0.17274313,0.010143327,0.014235313,-0.024152048,0.025684876,-0.0012504216,0.036601283,-0.003698782,0.0007310093,0.004165295,-0.0029157067,0.017101036,-0.046891227,-0.017460918,0.022965772,0.020233337,-0.024072073,0.017220996,0.009370248,0.0010363255,0.0194336,-0.019606877,0.01818068,-0.020819811,0.007410893,0.0019326969,0.017887443,0.006651143,0.00067394477,-0.011889419,-0.025058415,-0.008543854,0.021579562,0.0047484366,0.014062037,0.0075508473,-0.009510202,-0.009143656,0.0046817916,0.013982063,-0.0027990784,0.011782787,0.014541878,-0.015701497,-0.029350337,0.021979429,0.01332228,-0.026244693,-0.0123492675,-0.003895384,0.0071576433,-0.035454992,-0.00046984528,0.0033522295,0.039347045,0.0005119148,0.00476843,-0.012995721,0.0024042083,-0.006931051,-0.014461905,-0.0127558,0.0034555288,-0.0074842023,-0.030256703,-0.007057676,-0.00807734,0.007804097,-0.006957709,0.017181009,-0.034575284,-0.008603834,-0.005008351,-0.015834786,0.02943031,0.016861115,-0.0050849924,0.014235313,0.0051449724,0.0025924798,-0.0025741523,0.04289254,-0.002104307,0.012969063,-0.008310596,0.00423194,0.0074975314,0.0018810473,-0.014248641,-0.024725191,0.0151016945,-0.017527562,0.0018727167,0.0002830318,0.015168339,0.0144219175,-0.004048667,-0.004358565,0.011836103,-0.010343261,-0.005911387,0.0022825818,0.0073175905,0.00403867,0.013188991,0.03334902,0.006111321,0.008597169,0.030123414,-0.015474904,0.0017877447,-0.024551915,0.013155668,0.023525586,-0.0255116,0.017220996,0.004358565,-0.00934359,0.0099967085,0.011162991,0.03092315,-0.021046404,-0.015514892,0.0011946067,-0.01816735,0.010876419,-0.10124666,-0.03550831,0.0056348112,0.013942076,0.005951374,0.020419942,-0.006857742,-0.020873128,-0.021259667,0.0137554705,0.0057880944,-0.029163731,-0.018767154,-0.021392956,0.030896494,-0.005494857,-0.0027307675,-0.006801094,-0.014821786,0.021392956,-0.0018110704,-0.0018843795,-0.012362596,-0.0072176233,-0.017194338,-0.018713837,-0.024272008,0.03801415,0.00015880188,0.0044951867,-0.028630573,-0.0014070367,-0.00916365,-0.026537929,-0.009576847,-0.013995391,-0.0077107945,0.0050016865,0.00578143,-0.04467862,0.008363913,0.010136662,-0.0006268769,-0.006591163,0.015341615,-0.027377652,-0.00093136,0.029243704,-0.020886457,-0.01041657,-0.02424535,0.005291591,-0.02980352,-0.009190307,0.019460259,-0.0041286405,0.004801752,0.0011787785,-0.001257086,-0.011216307,-0.013395589,0.00088137644,-0.0051616337,0.03876057,-0.0033455652,0.00075850025,-0.006951045,-0.0062112883,0.018140694,-0.006351242,-0.008263946,0.018154023,-0.012189319,0.0075508473,-0.044358727,-0.0040153447,0.0093302615,-0.010636497,0.032789204,-0.005264933,-0.014235313,-0.018393943,0.007297597,-0.016114693,0.015021721,0.020033404,0.0137688,0.0011046362,0.010616505,-0.0039453674,0.012109346,0.021099718,-0.0072842683,-0.019153694,-0.003768759,0.039320387,-0.006747778,-0.0016852784,0.018154023,0.0010963057,-0.015035049,-0.021033075,-0.04345236,0.017287642,0.016341286,-0.008610498,0.00236922,0.009290274,0.028950468,-0.014475234,-0.0035654926,0.015434918,-0.03372223,0.004501851,-0.012929076,-0.008483873,-0.0044685286,-0.0102233,0.01615468,0.0022792495,0.010876419,-0.0059647025,0.01895376,-0.0069976957,-0.0042952523,0.017207667,-0.00036133936,0.0085905045,0.008084005,0.03129636,-0.016994404,-0.014915089,0.020100048,-0.012009379,-0.006684466,0.01306903,0.00015765642,-0.00530492,0.0005277429,0.015421589,0.015528221,0.032202728,-0.003485519,-0.0014286962,0.033908837,0.001367883,0.010509873,0.025271678,-0.020993087,0.019846799,0.006897729,-0.010216636,-0.00725761,0.01818068,-0.028443968,-0.011242964,-0.014435247,-0.013688826,0.006101324,-0.0022509254,0.013848773,-0.0019077052,0.017181009,0.03422873,0.005324913,-0.0035188415,0.014128681,-0.004898387,0.005038341,0.0012320944,-0.005561502,-0.017847456,0.0008538855,-0.0047884234,0.011849431,0.015421589,-0.013942076,0.0029790192,-0.013702155,0.0001199605,-0.024431955,0.019926772,0.022179363,-0.016487904,-0.03964028,0.0050849924,0.017487574,0.022792496,0.0012504216,0.004048667,-0.00997005,0.0076041627,-0.014328616,-0.020259995,0.0005598157,-0.010469886,0.0016852784,0.01716768,-0.008990373,-0.001987679,0.026417969,0.023792166,0.0046917885,-0.0071909656,-0.00032051947,-0.023259008,-0.009170313,0.02071318,-0.03156294,-0.030869836,-0.006324584,0.013795458,-0.00047151142,0.016874444,0.00947688,0.00985009,-0.029883493,0.024205362,-0.013522214,-0.015075036,-0.030603256,0.029270362,0.010503208,0.021539574,0.01743426,-0.023898797,0.022019416,-0.0068777353,0.027857494,-0.021259667,0.0025758184,0.006197959,0.006447877,-0.00025200035,-0.004941706,-0.021246338,-0.005504854,-0.008390571,-0.0097301295,0.027244363,-0.04446536,0.05216949,0.010243294,-0.016008062,0.0122493,-0.0199401,0.009077012,0.019753495,0.006431216,-0.037960835,-0.027377652,0.016381273,-0.0038620618,0.022512587,-0.010996379,-0.0015211658,-0.0102233,0.007071005,0.008230623,-0.009490209,-0.010083347,0.024431955,0.002427534,0.02828402,0.0035721571,-0.022192692,-0.011882754,0.010056688,0.0011904413,-0.01426197,-0.017500903,-0.00010985966,0.005591492,-0.0077707744,-0.012049366,0.011869425,0.00858384,-0.024698535,-0.030283362,0.020140035,0.011949399,-0.013968734,0.042732596,-0.011649498,-0.011982721,-0.016967745,-0.0060913274,-0.007130985,-0.013109017,-0.009710136};
// Specifies that the vector search will consider the 150 nearest neighbors
// in the specified index
var options = new VectorSearchOptions<EmbeddedMovie>()
{
IndexName = "vector_index",
NumberOfCandidates = 150
};
// Builds aggregation pipeline and specifies that the $vectorSearch stage
// returns 10 results
var results = queryableCollection
.VectorSearch(m => m.PlotEmbedding, vector, 10, options)
.Select(m => new { m.Title, m.Plot });

Los resultados del ejemplo anterior contienen los siguientes documentos:

{ "_id" : ObjectId("573a13a0f29313caabd04a4f"), "plot" : "A reporter, learning of time travelers visiting 20th century disasters, tries to change the history they know by averting upcoming disasters.", "title" : "Thrill Seekers" }
{ "_id" : ObjectId("573a13d8f29313caabda6557"), "plot" : "At the age of 21, Tim discovers he can travel in time and change what happens and has happened in his own life. His decision to make his world a better place by getting a girlfriend turns out not to be as easy as you might think.", "title" : "About Time" }
{ "_id" : ObjectId("573a13a5f29313caabd13b4b"), "plot" : "Hoping to alter the events of the past, a 19th century inventor instead travels 800,000 years into the future, where he finds humankind divided into two warring races.", "title" : "The Time Machine" }
{ "_id" : ObjectId("573a13aef29313caabd2e2d7"), "plot" : "After using his mother's newly built time machine, Dolf gets stuck involuntary in the year 1212. He ends up in a children's crusade where he confronts his new friends with modern techniques...", "title" : "Crusade in Jeans" }
{ "_id" : ObjectId("573a1399f29313caabceec0e"), "plot" : "An officer for a security agency that regulates time travel, must fend for his life against a shady politician who has a tie to his past.", "title" : "Timecop" }
{ "_id" : ObjectId("573a1399f29313caabcee36f"), "plot" : "A time-travel experiment in which a robot probe is sent from the year 2073 to the year 1973 goes terribly wrong thrusting one of the project scientists, a man named Nicholas Sinclair into a...", "title" : "A.P.E.X." }
{ "_id" : ObjectId("573a13c6f29313caabd715d3"), "plot" : "Agent J travels in time to M.I.B.'s early days in 1969 to stop an alien from assassinating his friend Agent K and changing history.", "title" : "Men in Black 3" }
{ "_id" : ObjectId("573a13d4f29313caabd98c13"), "plot" : "Bound by a shared destiny, a teen bursting with scientific curiosity and a former boy-genius inventor embark on a mission to unearth the secrets of a place somewhere in time and space that exists in their collective memory.", "title" : "Tomorrowland" }
{ "_id" : ObjectId("573a13b6f29313caabd477fa"), "plot" : "With the help of his uncle, a man travels to the future to try and bring his girlfriend back to life.", "title" : "Love Story 2050" }
{ "_id" : ObjectId("573a13e5f29313caabdc40c9"), "plot" : "A dimension-traveling wizard gets stuck in the 21st century because cell-phone radiation interferes with his magic. With his home world on the brink of war, he seeks help from a jaded ...", "title" : "The Portal" }

Para obtener más información sobre MongoDB búsqueda vectorial, los índices de búsqueda vectorial de MongoDB y cómo incorporarlos a tu aplicación, consulta Descripción general de MongoDB búsqueda vectorial en el manual de Atlas. Para más ejemplos sobre cómo ejecutar consultas de MongoDB Vector Search usando el driver .NET/C#, consulta Ejecutar consultas de búsqueda vectorial en el manual de Atlas y selecciona C# del menú desplegable de lenguajes.

Puede usar operadores de la pipeline de agregación en sus etapas de agregación para modificar documentos y realizar cálculos.

Las siguientes secciones describen los operadores de agregación que se pueden implementar mediante métodos de LINQ.

Esta sección describe los operadores bit a bit admitidos por el driver .NET/C# que puedes usar en una pipeline de agregación. Puede usar varios operadores bit a bit en la misma etapa. Las siguientes directrices se aplican al utilizar operadores a nivel de bits:

  • Todos los operandos deben ser del tipo int o long.

  • $bitAnd, $bitOr, y $bitXor toman dos o más operandos. $bitNot toma un operando.

  • Las operaciones bit a bit se evaluan de izquierda a derecha.

Los ejemplos de esta sección utilizan los siguientes documentos en una colección llamada ingredients:

{ "_id" : 1, "name" : "watermelon", "is_available" : 1, "is_cheap" : 1 },
{ "_id" : 2, "name" : "onions", "is_available" : 1, "is_cheap" : 0 },
{ "_id" : 3, "name" : "eggs", "is_available" : 0, "is_cheap" : 0 },
{ "_id" : 4, "name" : "potatoes", "is_available" : 1, "is_cheap" : 1 },
{ "_id" : 5, "name" : "pasta", "is_available" : 0, "is_cheap" : 1 },
{ "_id" : 6, "name" : "cheese", "is_available" : 1 }

El campo "is_available" representa si un ingrediente está disponible. Si este campo tiene un valor de 0, el ingrediente no está disponible. Si tiene un valor de 1, el ingrediente está disponible.

El campo "is_cheap" representa si un ingrediente es barato. Si este campo tiene un valor de 0, el ingrediente no es barato. Si tiene un valor de 1, el ingrediente es barato.

La siguiente clase Ingredient modela los documentos en la colección ingredients:

public class Ingredient
{
public int Id { get; set; }
public string Name { get; set; }
[BsonElement("is_available")]
public int? IsAvailable { get; set; }
[BsonElement("is_cheap")]
public int? IsCheap { get; set; }
}

Nota

Operadores faltantes o indefinidos

Si los operandos que pasas a cualquier operador bit a bit son de tipo nullable int o long y contienen un valor no definido o faltante, toda la expresión se evalúa como null. Si los operandos son de tipo no nulo int o long y contienen un valor faltante o indefinido, el controlador de .NET/C# lanzará un error.

El operador de agregación $bitAnd realiza una operación AND a nivel de bit en los argumentos dados. Puedes utilizar el operador $bitAnd conectando dos o más cláusulas con un carácter &.

El siguiente ejemplo muestra cómo crear una etapa $bitAnd utilizando LINQ. El código recupera el documento en el que el campo Name tiene el valor "watermelon". Luego realiza una operación AND a nivel de bits en los valores de los campos IsAvailable y IsCheap en este documento.

var query = queryableCollection
.Where(i => i.Name == "watermelon")
.Select(i => i.IsAvailable & i.IsCheap);

El código anterior devuelve 1, que es el resultado de la operación AND sobre los valores del campo IsAvailable (1) y el campo IsCheap (1).

El siguiente ejemplo realiza la misma operación AND bit a bit en todos los documentos de la colección:

var query = queryableCollection
.Select(i => i.IsAvailable & i.IsCheap);
1
0
0
1
0
null

El resultado null proviene del documento donde el campo Name tiene el valor "cheese". A este documento le falta un campo IsCheap, por lo que la expresión se evalúa como null.

El operador de agregación $bitOr realiza una operación OR a nivel de bit en los argumentos proporcionados. Puedes utilizar el operador $bitOr conectando dos o más cláusulas con un carácter |.

El siguiente ejemplo muestra cómo crear una etapa $bitOr mediante LINQ. El código recupera el documento en el que el campo Name tiene el valor "onions". Luego, realiza una operación OR a nivel de bits en los valores de los campos IsAvailable y IsCheap en este documento.

var query = queryableCollection
.Where(i => i.Name == "onions")
.Select(i => i.IsAvailable | i.IsCheap);

El código anterior devuelve 1, el resultado de la operación OR sobre los valores del campo IsAvailable (1) y del campo IsCheap (0).

El operador de agregación $bitNot realiza una operación de NOT bit a bit en el argumento dado. Puede utilizar el operador $bitNot precediendo un operando con un carácter ~. $bitNot solo acepta un argumento. El siguiente ejemplo muestra cómo crear una etapa $bitNot usando LINQ:

var query = queryableCollection
.Select(i => ~i.IsCheap);
-2
-1
-1
-2
-2
null

El operador de agregación $bitXor realiza una operación XOR bit a bit en los argumentos dados. Puede utilizar el operador $bitXor conectando dos o más cláusulas con un caracter ^.

El siguiente ejemplo muestra cómo crear una etapa $bitXor utilizando LINQ. El código recupera los documentos en los que el campo Name tiene el valor "watermelon" o "onions". Luego realiza una operación bit a bit XOR en los valores de los campos IsAvailable y IsCheap en estos documentos.

var query = queryableCollection
.Where(i => i.Name == "watermelon" || i.Name == "onions")
.Select(i => i.IsAvailable ^ i.IsCheap);

El resultado contiene los siguientes valores:

0
1

El operador $convert convierte un valor a un tipo especificado. Puede utilizar este operador para realizar conversiones de tipo en etapas como $project, $addFields y $set.

En el controlador, puedes utilizar el método Mql.Convert() para convertir un valor de un tipo a otro tipo especificado. Para obtener más información sobre el comportamiento de conversión y las conversiones permitidas, consulta la Referencia $convert en el manual de MongoDB Server.

El método Convert() requiere los siguientes parámetros:

Parameter
Descripción

value

Valor a convertir. Los tipos de entrada aceptados dependen del tipo de destino.

options

ConvertOptions<TTo> Instancia que especifica el tipo de destino y las opciones de conversión, como el manejo de errores. Los tipos de destino aceptados dependen del tipo de entrada.

La clase ConvertOptions<TTo> contiene las siguientes propiedades:

Propiedad
Tipo de dato
Descripción

Base

ConvertBase?

Base numérica para conversiones entre tipos de cadena y numéricos. Esta propiedad requiere MongoDB Server 8.3 o posterior. Para ver un ejemplo de esta propiedad, consulte Especificar una base numérica para la conversión de cadenas.

ByteOrder

Orden de bytes de los datos binarios para conversiones hacia y desde tipos numéricos.

Format

string

Formato de codificación de cadena para conversiones entre valores BinData y string. Esta propiedad acepta los siguientes valores:

  • "base64"

  • "base64url"

  • "hex"

  • "uuid"

OnError

TTo

Valor que se devolverá si se produce un error durante la conversión.

OnNull

TTo

Valor que se devolverá si el valor de entrada es null o no está presente.

SubType

Subtipo binario BSON para conversiones de datos binarios.

El siguiente ejemplo de código utiliza métodos LINQ para convertir los valores RestaurantId string a valores int en una proyección Select(). El código devuelve -1 si se produce un error durante la conversión y 0 si el valor de entrada es null o no está presente.

var query = queryableCollection
.Select(r => Mql.Convert(r.RestaurantId, new ConvertOptions<int> { OnError = -1, OnNull = 0 }));

El controlador almacena los valores convertidos bajo el nombre del campo original en los documentos de salida.

Nota

Esta función requiere MongoDB Server 8.3 o posterior.

Puedes usar Mql.Convert() para convertir cualquier tipo BSON a un string. El controlador asigna esta operación al operador de agregación $toString.

El siguiente ejemplo convierte el campo Id de cada documento de restaurante de un ObjectId a un string:

var query = queryableCollection
.Select(r => Mql.Convert(r.Id, new ConvertOptions<string>()));

Nota

Esta función requiere MongoDB Server 8.3 o posterior.

Puedes usar Mql.Convert() para convertir una cadena JSON en un objeto BsonDocument o BsonArray. El controlador asigna estas operaciones a los operadores de agregación $toObject y $toArray.

El siguiente ejemplo convierte un campo string que contiene JSON a un campo BsonDocument:

var query = queryableCollection
.Select(d => Mql.Convert(d.JsonData, new ConvertOptions<BsonDocument>()));

El siguiente ejemplo convierte un campo string que contiene JSON a un campo BsonArray:

var query = queryableCollection
.Select(d => Mql.Convert(d.JsonData, new ConvertOptions<BsonArray>()));

Nota

Esta función requiere MongoDB Server 8.3 o posterior.

Para especificar la base numérica al convertir entre tipos numéricos y cadenas, establezca la propiedad ConvertOptions.Base en un valor ConvertBase. Esto se corresponde con el campo base del operador de agregación $convert. La enumeración ConvertBase admite los siguientes valores:

Valor
Descripción

ConvertBase.Binary

Base 2 (binario)

ConvertBase.Octal

Base 8 (octal)

ConvertBase.Decimal

Base 10 (decimal)

ConvertBase.Hexadecimal

Base 16 (hexadecimal)

El siguiente ejemplo interpreta la cadena RestaurantId como un valor hexadecimal y la convierte en un número entero:

var query = queryableCollection
.Select(r => Mql.Convert(r.RestaurantId,
new ConvertOptions<int>
{
Base = ConvertBase.Hexadecimal
}));

El driver .NET/C# admite operaciones de reemplazo y división de string en expresiones LINQ. Las siguientes secciones describen cómo realizar estas operaciones.

Nota

Las formas basadas en expresiones regulares de este método requieren MongoDB Server versión 8.3.0 o posterior.

El operador $replaceAll reemplaza todas las apariciones de una string de búsqueda o patrón dentro de la string de entrada. El controlador de .NET/C# ofrece varios métodos que se traducen al operador $replaceAll.

Para reemplazar todas las ocurrencias de un string literal por otro, utiliza el método string.Replace(). El siguiente ejemplo reemplaza todas las apariciones de "Cafe" por "Coffee Shop" en el campo Name de todos los documentos de la colección:

var query = queryableCollection
.Select(r => new
{
r.Name,
Updated = r.Name.Replace("Cafe", "Coffee Shop")
});

Para reemplazar todas las apariciones de una coincidencia de expresión regular por un literal de string, utiliza el método estático Regex.Replace(). El siguiente ejemplo es equivalente al anterior, pero utiliza una expresión regular que distingue mayúsculas y minúsculas en lugar de un literal de string:

var query = queryableCollection
.Select(r => new
{
r.Name,
Updated = Regex.Replace(r.Name, "cafe",
"Coffee Shop", RegexOptions.IgnoreCase)
});

Importante

Evita referencias inversas en las cadenas de reemplazo

El operador $replaceAll no admite referencias inversas en las cadenas de reemplazo. Evita los valores de reemplazo como "$1" que hacen referencia a un grupo de captura en el patrón de búsqueda.

También puedes llamar al método Replace() en una instancia de Regex. El siguiente ejemplo crea un objeto Regex y llama a su método Replace() en la expresión LINQ:

var pattern = new Regex("cafe", RegexOptions.IgnoreCase);
var query = queryableCollection
.Select(r => new
{
r.Name,
Updated = pattern.Replace(r.Name, "Coffee Shop")
});

Nota

Campos de documento Regex

Si el objeto Regex es un campo de documento más que una variable local, debes marcarlo para su serialización como BsonType.RegularExpression.

Importante

Sobrecargas no admitidas

Las siguientes sobrecargas de Replace() lanzan un ExpressionNotSupportedException en tiempo de ejecución:

  • string.Replace(string, string, StringComparison).

  • string.Replace(string, string, bool, CultureInfo).

  • Sobrecargas de Regex.Replace() que aceptan un delegado MatchEvaluator.

  • Cualquier sobrecarga donde la string de búsqueda esté vacía (""). El operador $replaceAll genera un error del lado del servidor si el valor de find es una string vacía.

Nota

Las formas basadas en expresiones regulares de este método requieren MongoDB Server versión 8.3.0 o posterior.

El operador $split divide una cadena en un arreglo de subcadenas según un delimitador especificado. El controlador de .NET/C# ofrece varios métodos que se traducen al operador $split.

Para dividir por un carácter literal o string, utiliza el método string.Split(). El siguiente ejemplo divide el campo Cuisine usando la coma:

var query = queryableCollection
.Select(r => new
{
r.Cuisine,
Parts = r.Cuisine.Split(',', StringSplitOptions.None)
});

Si la string de destino contiene delimitadores consecutivos, los resultados incluirán strings vacías. Para filtrar las cadenas vacías del resultado, páselas StringSplitOptions.RemoveEmptyEntries al método Split(). El siguiente ejemplo realiza la misma división que el ejemplo anterior, pero omite las cadenas vacías:

var query = queryableCollection
.Select(r => new
{
r.Cuisine,
Parts = r.Cuisine.Split(',',
StringSplitOptions.RemoveEmptyEntries)
});

Para dividir con una expresión regular, utiliza el método estático Regex.Split(). El siguiente ejemplo divide el campo Cuisine en una coma seguida de cero o más caracteres de espacio en blanco:

var query = queryableCollection
.Select(r => new
{
r.Cuisine,
Parts = Regex.Split(r.Cuisine, @",\s*")
});

Importante

Casos no admitidos

Los siguientes casos provocan errores en tiempo de ejecución:

  • Llamar a una sobrecarga Split() que especifique varios separadores

  • Pasar una string vacía como delimitador

Nota

$createObjectId requiere la versión 8.3 o superior de MongoDB Server.

El operador $createObjectId genera un nuevo valor único de ObjectId. Puedes usar este operador en etapas como $project, $addFields y $set.

Para agregar este operador a una expresión LINQ, utilice el método Mql.CreateObjectId() en una expresión LINQ. El método no toma parámetros.

El siguiente ejemplo usa Mql.CreateObjectId() en una proyección Select() para asignar un nuevo ObjectId a un campo llamado NewId en cada documento de salida:

var query = queryableCollection
.Select(d => new { NewId = Mql.CreateObjectId() });

Los operadores de serialización de Extended JSON (EJSON) convierten entre valores BSON y sus representaciones Extended JSON v2 en un pipeline de agregación. Las siguientes secciones explican cómo usar estos operadores en expresiones LINQ.

Importante

Los operadores de serialización EJSON requieren MongoDB Server versión 8.3 o posterior.

El operador de expresión $serializeEJSON convierte los valores BSON nativos a su representación EJSON v2. La salida es un documento BSON que contiene contenedores de tipo EJSON. Por ejemplo, un valor de ObjectId se serializa en el siguiente documento:

{ "$oid" : "507f1f77bcf86cd799439011" }

Para utilizar el operador de expresión $serializeEJSON en una expresión LINQ, llama al método Mql.SerializeEJson<TInput, TOutput>(). Este método acepta los siguientes parámetros:

Parameter
Descripción

value

Valor BSON a serializar.

options

(Opcional) Una instancia de SerializeEJsonOptions<TOutput> que específica las opciones de serialización.

Puede configurar las siguientes opciones en una instancia de SerializeEJsonOptions<TOutput>:

Opción
Tipo de dato
Descripción

Relaxed

bool?

Especifica si la salida utiliza el formato EJSON relajado. Cuando true, la salida utiliza tipos JSON estándar cuando sea posible. Cuando false, la salida usa el formato canónico EJSON, que preserva la información exacta del tipo BSON.

Por defecto: true

OnError

TOutput

Valor de respaldo devuelto si la serialización falla.

El siguiente código serializa el campo Id de cada documento de restaurante a su representación EJSON v2:

var query = queryableCollection
.Select(r => Mql.SerializeEJson<ObjectId, BsonDocument>(
r.Id,
new SerializeEJsonOptions<BsonDocument>()));

El operador de expresión $deserializeEJSON convierte un documento EJSON v2 en valores BSON nativos.

Para utilizar el operador de expresión $deserializeEJSON en una expresión LINQ, llama al método Mql.DeserializeEJson<TInput, TOutput>(). Este método acepta los siguientes parámetros:

Parameter
Descripción

value

Valor EJSON a deserializar.

options

(Opcional), una instancia DeserializeEJsonOptions<TOutput> que especifica las opciones de deserialización.

La clase DeserializeEJsonOptions<TOutput> contiene la propiedad OnError. Puede establecer esta propiedad en el valor alternativo que el método devuelve si la deserialización falla.

El siguiente código deserializa un valor ObjectId con formato EJSON de vuelta a su tipo nativo. Este ejemplo utiliza una colección tipada como BsonDocument, donde cada documento contiene un campo ejsonId que almacena un documento BSON con contenedores de tipo EJSON.

var rawCollection = myDatabase
.GetCollection<BsonDocument>("myCollection")
.AsQueryable();
var query = rawCollection
.Select(doc => Mql.DeserializeEJson<BsonDocument, BsonDocument>(
doc["ejsonId"].AsBsonDocument,
new DeserializeEJsonOptions<BsonDocument>()));

Los operadores de similitud vectorial miden la similitud matemática entre dos campos vectoriales en un pipeline de agregación.

Importante

Los operadores de similitud vectorial requieren la versión 8.2 o posterior del MongoDB Server.

Puedes calcular la similitud de vectores llamando a métodos en la clase Mql en una expresión LINQ. Cada método toma los siguientes parámetros:

  • Dos campos vectoriales para comparar. Los tipos de campo admitidos incluyen float[], double[], List<float>, List<double>, ICollection<float>, ICollection<double>, ReadOnlyMemory<float> y ReadOnlyMemory<double>.

  • Un valor bool que especifica si se normaliza el resultado obtenido.

Los ejemplos de esta sección utilizan los siguientes documentos en una colección llamada vectors:

{ "_id": 1, "vector1": [1.0, 2.0, 3.0], "vector2": [1.0, 2.0, 3.0] },
{ "_id": 2, "vector1": [1.0, 2.0, 3.0], "vector2": [3.0, 2.0, 1.0] }

La siguiente clase VectorDocument modela los documentos en esta colección:

public class VectorDocument
{
public int Id { get; set; }
[BsonElement("vector1")]
public float[] Vector1 { get; set; }
[BsonElement("vector2")]
public float[] Vector2 { get; set; }
}

Utiliza Mql.SimilarityDotProduct() para calcular el producto escalar entre dos vectores. El producto punto equivale a la suma de los productos de los elementos correspondientes.

El siguiente ejemplo calcula la puntuación de similitud del producto escalar entre los campos Vector1 y Vector2 de cada documento:

var query = queryableCollection
.Select(x => Mql.SimilarityDotProduct(x.Vector1, x.Vector2, true));

Utilice Mql.SimilarityCosine() para calcular la similitud coseno entre dos vectores. La similitud del coseno mide el coseno del ángulo entre dos vectores.

El siguiente ejemplo calcula la puntuación de similitud de coseno entre los campos Vector1 y Vector2 para cada documento:

var query = queryableCollection
.Select(x => Mql.SimilarityCosine(x.Vector1, x.Vector2, true));

Utiliza Mql.SimilarityEuclidean() para calcular la distancia euclídea entre dos vectores. La distancia euclidiana mide la distancia en línea recta entre dos puntos en un espacio vectorial.

El siguiente ejemplo calcula la puntuación de similitud euclidiana entre los campos Vector1 y Vector2 de cada documento:

var query = queryableCollection
.Select(x => Mql.SimilarityEuclidean(x.Vector1, x.Vector2, true));

La implementación de LINQ del controlador de MongoDB .NET/C# no admite las siguientes etapas de agregación:

  • $redact

  • $geoNear

  • $out

Para aprender a crear una canalización de agregación con la etapa $out utilizando desarrolladores, consulte Etapas de la canalización de agregación.

La siguiente tabla describe algunos métodos admitidos por la implementación MongoDB .NET/C# Driver de LINQ:

Nombre del método
Descripción

Any

Determina si algún documento cumple con los criterios especificados

Average

Calcula el promedio de los campos especificados

Count

Devuelve un Int32 que representa la cantidad de documentos que cumplen los criterios especificados.

LongCount

Devuelve un Int64 que representa la cantidad de documentos que cumplen los criterios especificados.

Convert

Convierte un valor de un tipo a un tipo especificado diferente

CreateObjectId

Genera un valor único ObjectId

DateFromString

Convierte un string en un objeto DateTime

DeserializeEJson

Convierte un documento EJSON con contenedores de tipo a un tipo BSON nativo

Distinct

Devuelve documentos distintos que coinciden con los criterios especificados

DistinctMany

Devuelve documentos únicos de un arreglo que concuerdan con los criterios especificados

Exists

Prueba si un campo existe

First

Devuelve el primer documento que coincida, y lanza una excepción si no se encuentra ninguno

FirstOrDefault

Devuelve el primer documento coincidente, o null si no se encuentran ninguno

GroupBy

Agrupa documentos en función de los criterios especificados

GroupJoin

Realiza una unión externa izquierda a otra colección en la misma base de datos

IsMissing

Devuelve true si falta un campo y false en caso contrario

IsNullOrMissing

Devuelve true si un campo es nulo o falta, y falso en caso contrario

Max

Devuelve el documento con el valor máximo especificado

OfType

Devuelve documentos que coincidan con el tipo especificado

OrderBy, OrderByDescending

Devuelve resultados en un orden de clasificación especificado

Replace

Reemplaza todas las ocurrencias de una string de búsqueda o patrón de expresión regular en un campo de string (se traduce como $replaceAll)

Select

Selecciona documentos en función de criterios específicos

SelectMany

Proyecta cada elemento de una secuencia y combina las secuencias resultantes en un solo documento. Admite una sobrecarga de índice (SelectMany((item, index) => ...)) cuando se ejecuta en MongoDB Server 8.3 o posterior.

SerializeEJson

Convierte un valor BSON nativo a su representación EJSON v2 como un documento BSON con contenedores de tipo EJSON

SimilarityCosine

Calcula la similitud del coseno entre dos vectores

SimilarityDotProduct

Calcula el producto escalar entre dos vectores

SimilarityEuclidean

Calcula la distancia euclidiana entre dos vectores

Single

Devuelve el único documento coincidente y lanza una excepción si no hay exactamente un documento

SingleOrDefault

Devuelve un solo documento coincidente o null si no hay documentos coincidentes

Skip

Se omite una cantidad especificada de documentos y se devuelve el resto de los resultados

SkipWhile (solo en proyecciones de Select)

Omite los elementos del arreglo mientras una condición sea verdadera y devuelve los elementos restantes.

Split

Divide un campo de string en un delimitador y devuelve un arreglo de subcadenas (se traduce como $split)

Sum

Devuelve la suma de los valores en un campo especificado

Take

Especifica la cantidad de resultados a devolver

TakeWhile (solo en proyecciones de Select)

Devuelve elementos de un arreglo mientras se cumpla una condición y omite los elementos restantes

ThenBy, ThenByDescending

Permite especificar un orden secundario

Where

Devuelve todos los documentos que cumplen con tus criterios especificados.

Cuando se ejecuta una query LINQ, el driver de .NET/C# traduce automáticamente su query en un pipeline de agregación escrita con la API de queries de MongoDB. Puedes ver la query traducida utilizando el método ToString() o la propiedad LoggedStages.

Para ver la query traducida de operaciones no escalares, utilice el método ToString(). Las operaciones no escalares son operaciones que devuelven un objeto de query, como:

  • Where

  • Select

  • SelectMany

  • GroupJoin

El siguiente ejemplo llama al método ToString() en una query LINQ e imprime la query traducida:

var queryableCollection = _restaurantsCollection.AsQueryable();
var query = queryableCollection
.Where(r => r.Name == "The Movable Feast");
var queryTranslated = query.ToString();
Console.WriteLine(queryTranslated);
sample_restaurants.restaurants.Aggregate([{ "$match" : { "name" : "The Movable Feast" } }])

Para obtener la query traducida para operaciones escalares, utiliza la propiedad LoggedStages. Las operaciones escalares son operaciones que devuelven un resultado escalar en lugar de un objeto de query, tales como:

  • First

  • Sum

  • Count

  • Min

  • Max

Para obtener una query traducida con la propiedad LoggedStages, debe guardar la query traducida directamente después de que se ejecute y antes de ejecutar cualquier otra query con el mismo objeto consultable.

El siguiente ejemplo utiliza la propiedad LoggedStages en una query LINQ que usa una operación escalar, luego imprime la query traducida:

var queryableCollection = _restaurantsCollection.AsQueryable();
var query = queryableCollection
.Where(r => r.Name == "The Movable Feast");
var result = query.FirstOrDefault();
var queryTranslated = query.LoggedStages;
Console.WriteLine(queryTranslated.ToJson());
[{ "$match" : { "name" : "The Movable Feast" } }, { "$limit" : NumberLong(1) }]

Importante

LoggedStages no es seguro para subprocesos. Ejecutar una query y acceder a la propiedad LoggedStages asociada desde varios subprocesos podría tener resultados no deterministas.

Para obtener una lista completa de los métodos LINQ compatibles, consulta la siguiente documentación de la API:

Volver

Etapas del pipeline