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

Cómo personalizar la puntuación de los documentos en los resultados

Puedes personalizar el puntaje de los documentos en los resultados. Al ajustar cómo se calculan los puntajes, puede asegurarse de que los documentos más pertinentes estén ubicados más alto en los resultados de búsqueda. Para aprender más acerca de las diferentes formas en que puede personalizar la puntuación, consulte Califique los documentos en los resultados. Esta página demuestra cómo modificar la puntuación de los documentos en los resultados para mejorar u ocultar los resultados y cómo normalizar tu puntuación de query $search en el rango de 0 a 1 en las etapas subsiguientes de tu pipeline de agregación. .

A cada documento que devuelve una query de MongoDB Search se le asigna una puntuación basada en su relevancia. Los documentos incluidos en un conjunto de resultados se devuelven en orden desde la puntuación más alta hasta la más baja. Para aprender más, se puede consultar Puntuar los documentos en los resultados.

Puede utilizar las siguientes opciones con todos los operadores para modificar el comportamiento por defecto de puntuación. Para detalles y ejemplos, haga clic en cualquiera de las siguientes opciones:

Esta sección muestra cómo agregar pesos a los campos de búsqueda para aumentar o reducir la puntuación de los documentos en los resultados o en una categoría de resultados. En concreto, muestra cómo asignar uno o más valores a un campo para devolver resultados con una puntuación mayor o menor.

Puedes configurar un índice con mapeos dinámicos activados para indexar todos los campos de la colección o con mapeos estáticos en los campos a query y ordenar los resultados en función de ellos. Para obtener más información sobre la creación de índices de búsqueda de MongoDB, consulte Administrar índices de búsqueda de MongoDB.

Las consultas de ejemplo muestran cómo aumentar o enterrar los documentos en los resultados. Utilizan el operador compuesto para combinar dos o más operadores en una sola query.


➤ Usa el menú desplegable Selecciona tu lenguaje para elegir el cliente con el que deseas probar los ejemplos de esta sección.


Utiliza el operador compuesto para combinar dos o más operadores en una sola query y utiliza las opciones de puntuación para modificar la puntuación de relevancia que devuelve MongoDB Search.

Utiliza los campos title y year en el namespace sample_mflix.movies para aumentar la puntuación de relevancia que MongoDB Search devuelve para los títulos de películas que contienen el término snow. Si configuras el índice en movies colección, podrás ejecutar las siguientes consultas.

1

Puedes ir a la página de búsqueda de MongoDB desde la opción Search & Vector Search o desde el Data Explorer.

  1. Si aún no aparece, se debe seleccionar la organización que contiene el proyecto en el menú Organizations de la barra de navegación.

  2. Si aún no se muestra, seleccione su proyecto en el menú Projects de la barra de navegación.

  3. En la barra lateral, haz clic en Search & Vector Search en la sección Database.

    • Si no tienes clústeres, haz clic en Create cluster para crear uno. Para obtener más información, consulta Crear un clúster.

    • Si el proyecto tiene varios clústeres, se debe seleccionar el clúster que se desea usar en el menú desplegable Select cluster y luego se debe hacer clic en Go to Search.

    Aparece la página de Búsqueda y Búsqueda Vectorial.

  1. Si aún no aparece, se debe seleccionar la organización que contiene el proyecto en el menú Organizations de la barra de navegación.

  2. Si aún no se muestra, seleccione su proyecto en el menú Projects de la barra de navegación.

  3. En la barra lateral, haz clic en Data Explorer en la sección Database.

  4. Expanda la base de datos y seleccione la colección.

  5. Haga clic en la pestaña Indexes para la colección.

  6. Haga clic en el enlace Search and Vector Search en el banner.

    Aparece la página de Búsqueda y Búsqueda Vectorial.

2

Haz clic en el botón Query a la derecha del índice que deseas consultar.

3

Haz clic en Edit Query para ver una muestra de sintaxis de query por defecto en formato JSON.

4

Copia y pega la siguiente query en el Query Editor, y luego haz clic en el botón Search en el Query Editor.

Los siguientes ejemplos utilizan el operador compound con subconsultas para buscar películas entre los años 2013 y 2015 que contengan el término snow en el campo title.

La siguiente query:

  • Usa las siguientes cláusulas del operador compound:

    • filter cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

    • should cláusula con el texto operador para consultar el término snow en el campo title y alterar el score con la opción constant. La opción constant reemplaza todos los resultados de puntuación para el término de búsqueda con 5.

  • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

[
{
$search: {
index: "default",
compound: {
filter: [{
range: {
path: "year",
gte: 2013,
lte: 2015
}
}],
should: [{
text: {
query: "snow",
path: "title",
score: {constant: {value: 5}}
}
}]
},
highlight:{
path: "title"
}
}
}
]
SCORE: 5 _id: "573a13d7f29313caabda38ad"
Snow in Paradise
Matching fields: title
SCORE: 5 _id: "573a13e2f29313caabdbeded"
Dead Snow 2: red vs.
Matching fields: title
SCORE: 5 _id: "573a13e6f29313caabdc66c4"
The Snow White Murder Case
Matching fields: title
SCORE: 5 _id: "573a13edf29313caabdd37bd"
Snow on the Blades
Matching fields: title
SCORE: 0 _id: "573a13acf29313caabd29366"
No highlights found.
Matching fields: unknown
SCORE: 0 _id: "573a13adf29313caabd2b765"
No highlights found.
Matching fields: unknown
SCORE: 0 _id: "573a13b0f29313caabd333e7"
No highlights found.
Matching fields: unknown
SCORE: 0 _id: "573a13b0f29313caabd3486a"
No highlights found.
Matching fields: unknown
SCORE: 0 _id: "573a13b1f29313caabd3719d"
No highlights found.
Matching fields: unknown
SCORE: 0 _id: "573a13b2f29313caabd3abb9"
No highlights found.
Matching fields: unknown

Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción constant.

La siguiente query:

  • Usa las siguientes cláusulas del operador compound:

    • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

    • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción boost. La opción boost multiplica la puntuación base en los resultados para el término de búsqueda por 2.

  • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

[
{
$search: {
index: "default",
compound: {
must: [{
range: {
path: "year",
gte: 2013,
lte: 2015
}
}],
should: [{
text: {
query: "snow",
path: "title",
score: {boost: {value: 2}}
}
}]
},
highlight:{
path: "title"
}
}
}
]
SCORE: 6.7722930908203125 _id: "573a13d7f29313caabda38ad"
Snow in Paradise
Matching fields: title
SCORE: 6.063445568084717 _id: "573a13edf29313caabdd37bd"
Snow on the Blades
Matching fields: title
SCORE: 5.509652137756348 _id: "573a13e6f29313caabdc66c4"
The Snow White Murder Case
Matching fields: title
SCORE: 5.065053939819336 _id: "573a13e2f29313caabdbeded"
Dead Snow 2: Red vs.
Matching fields: title
SCORE: 1 _id: "573a13acf29313caabd29366"
No highlights found.
Matching fields: unknown
SCORE: 1 _id: "573a13adf29313caabd2b765"
No highlights found.
Matching fields: unknown
SCORE: 1 _id: "573a13b0f29313caabd333e7"
No highlights found.
Matching fields: unknown
SCORE: 1 _id: "573a13b0f29313caabd3486a"
No highlights found.
Matching fields: unknown
SCORE: 1 _id: "573a13b1f29313caabd3719d"
No highlights found.
Matching fields: unknown
SCORE: 1 _id: "573a13b2f29313caabd3abb9"
No highlights found.
Matching fields: unknown

Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción boost.

La siguiente query:

  • Utiliza las siguientes cláusulas de operador compound con la opción boost para priorizar algunos campos más que otros:

    • must cláusula con el operador text para dar máxima prioridad al género comedy, seguido del término snow en el campo title. La opción boost aplica ponderaciones a los campos.

    • should cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

    Nota

    La opción boost aplica diferentes pesos a los campos para priorizarlos.

[
{
$search: {
index: "default",
compound: {
must: [{
text: {
query: "comedy",
path: "genres",
score: {boost: {value: 9}}
}
},
{
text: {
query: "snow",
path: "title",
score: {boost: {value: 5}}
}
}],
should: [{
range: {
path: "year",
gte: 2013,
lte: 2015,
score: {boost: {value: 3}}
}
}]
}
}
}
]
SCORE: 21.872983932495117 _id: "573a13c2f29313caabd6874c"
plot: "A ski vacation turns horrific for a group of medical students, as they…"
genres: Array
runtime: 91
SCORE: 21.043487548828125 _id: "573a139ff29313caabcffff8"
fullplot: "When an entire town in upstate New York is closed down by an unexpecte…"
imdb: Object
year: 2000
SCORE: 21.043487548828125 _id: "573a13a6f29313caabd16b02"
plot: "When a Miami dentist inherits a team of sled dogs, he's got to learn t…"
genres: Array
runtime: 99
SCORE: 19.523927688598633 _id: "573a13a1f29313caabd06765"
fullplot: "Our two young lovers meet on a series of snowy days in high school. Ye…"
imdb: Object
runtime: 1999
SCORE: 17.426334381103516 _id: "573a13e2f29313caabdbeded"
plot: "Still on the run from a group of Nazi zombies, a man seeks the aid of …"
genres: Array
runtime: 100
SCORE: 16.367326736450195 _id: "573a13c2f29313caabd6688e"
countries: Array
genres: Array
runtime: 108
SCORE: 15.537829399108887 _id: "573a13b1f29313caabd36d7d"
plot: "A love-struck Italian poet is stuck in Iraq at the onset of an America…"
genres: Array
runtime: 110
SCORE: 14.4263334274292 _id: "573a1395f29313caabce1925"
plot: "An ice-skating Snow White finds refuge from the Wicked Queen with the …"
genres: Array
runtime: 107

La siguiente query:

  • Usa las siguientes cláusulas del operador compound:

    • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

    • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción function. La opción function añade lo siguiente mediante una expresión aritmética:

      • La puntuación de relevancia de la query para el término de búsqueda

      • El valor del campo numérico denominado imdb.rating o el número 2 para aquellos documentos que no tienen el campo imdb.rating.

  • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

[
{
$search: {
index: "default",
compound: {
must: [{
range: {
path: "year",
gte: 2013,
lte: 2015,
}
}],
should: [{
text: {
query: "snow",
path: "title",
score: {
function: {
add: [{
path: {
value: "imdb.rating",
undefined: 2
}
},
{
score: "relevance"
}]
}
}
}
}]
},
highlight: {
path: "title"
}
}
}
]
SCORE: 10.454826354980469 _id: "573a13e6f29313caabdc66c4"
The Snow White Murder Case
Matching fields: title
SCORE: 10.3317232131958 _id: "573a13edf29313caabdd37bd"
Snow on the Blades
Matching fields: title
SCORE: 10.032526969909668 _id: "573a13e2f29313caabdbeded"
Dead Snow 2: Red vs.
Matching fields: title
SCORE: 8.386146545410156 _id: "573a13d7f29313caabda38ad"
Snow in Paradise
Matching fields: title
SCORE: 1 _id: "573a13acf29313caabd29366"
No highlights found.
Matching fields: unknown
SCORE: 1 _id: "573a13adf29313caabd2b765"
No highlights found.
Matching fields: unknown
SCORE: 1 _id: "573a13b0f29313caabd333e7"
No highlights found.
Matching fields: unknown
SCORE: 1 _id: "573a13b0f29313caabd3486a"
No highlights found.
Matching fields: unknown
SCORE: 1 _id: "573a13b1f29313caabd3719d"
No highlights found.
Matching fields: unknown
SCORE: 1 _id: "573a13b2f29313caabd3abb9"
No highlights found.
Matching fields: unknown

Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción function.

5

Es posible que Search Tester no muestre todos los campos en los documentos que devuelve. Para ver todos los campos, incluido el campo que especifica en la ruta de query, expanda el documento en los resultados.

1

Se debe abrir mongosh en una ventana de terminal y realizar la conexión al clúster. Para obtener instrucciones detalladas sobre cómo realizar la conexión, se debe consultar Conexión a un clúster a través de mongosh.

2

Ejecuta el siguiente comando en el prompt mongosh:

use sample_mflix
3

Los siguientes ejemplos utilizan el operador compound con subconsultas para buscar películas entre los años 2013 y 2015 que contengan el término snow en el campo title.

Esta query utiliza las siguientes etapas de pipeline:

  • $search para query la colección. La query:

    • Usa las siguientes cláusulas del operador compound:

      • filter cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el texto operador para consultar el término snow en el campo title y alterar el score con la opción constant. La opción constant reemplaza todos los resultados de puntuación para el término de búsqueda con 5.

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

  • $limit etapa para limitar la salida a 10 resultados.

  • $project preparar para:

    • Excluir todos los campos salvo title y year

    • Agrega un campo score

db.movies.aggregate([
{
"$search": {
"index": "default",
"compound": {
"filter": [{
"range": {
"path": "year",
"gte": 2013,
"lte": 2015
}
}],
"should": [{
"text": {
"query": "snow",
"path": "title",
"score": {"constant": {"value": 5}}
}
}]
},
"highlight": {
"path": "title"
}
}
},
{
"$limit": 10
},
{
"$project": {
"_id": 0,
"title": 1,
"year": 1,
"score": { "$meta": "searchScore" },
"highlights": { "$meta": "searchHighlights" }
}
}
])

MongoDB Search devuelve los siguientes resultados para constant:

[
{
title: 'Snow in Paradise',
year: 2014,
score: 5,
highlights: [
{
score: 1.382846713066101,
path: 'title',
texts: [
{ value: 'Snow', type: 'hit' },
{ value: ' in Paradise', type: 'text' }
]
}
]
},
{
title: 'Dead Snow 2: Red vs. Dead',
year: 2014,
score: 5,
highlights: [
{
score: 1.3924485445022583,
path: 'title',
texts: [
{ value: 'Dead ', type: 'text' },
{ value: 'Snow', type: 'hit' },
{ value: ' 2: Red vs. ', type: 'text' }
]
}
]
},
{
title: 'The Snow White Murder Case',
year: 2014,
score: 5,
highlights: [
{
score: 1.3525336980819702,
path: 'title',
texts: [
{ value: 'The ', type: 'text' },
{ value: 'Snow', type: 'hit' },
{ value: ' White Murder Case', type: 'text' }
]
}
]
},
{
title: 'Snow on the Blades',
year: 2014,
score: 5,
highlights: [
{
score: 1.3766303062438965,
path: 'title',
texts: [
{ value: 'Snow', type: 'hit' },
{ value: ' on the Blades', type: 'text' }
]
}
]
},
{ year: 2013, title: 'The Secret Life of Walter Mitty', score: 0, highlights: [] },
{ title: 'Jurassic World', year: 2015, score: 0, highlights: [] },
{ title: 'Action Jackson', year: 2014, score: 0, highlights: [] },
{ year: 2013, title: 'In Secret', score: 0, highlights: [] },
{ title: 'The Stanford Prison Experiment', year: 2015, score: 0, highlights: [] },
{ year: 2014, title: 'The Giver', score: 0, highlights: [] }
]

Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción constant.

Esta query utiliza las siguientes etapas de pipeline:

  • $search para query la colección. La query:

    • Usa las siguientes cláusulas del operador compound:

      • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción boost. La opción boost multiplica la puntuación base en los resultados para el término de búsqueda por 2.

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

  • $limit etapa para limitar la salida a 10 resultados.

  • $project preparar para:

    • Excluir todos los campos salvo title y year

    • Agrega un campo score

db.movies.aggregate([
{
"$search": {
"index": "default",
"compound": {
"must": [{
"range": {
"path": "year",
"gte": 2013,
"lte": 2015
}
}],
"should": [{
"text": {
"query": "snow",
"path": "title",
"score": {"boost": {"value": 2}}
}
}]
},
"highlight": {
"path": "title"
}
}
},
{
"$limit": 10
},
{
"$project": {
"_id": 0,
"title": 1,
"year": 1,
"score": { "$meta": "searchScore" },
"highlights": { "$meta": "searchHighlights" }
}
}
])

MongoDB Search devuelve los siguientes resultados para boost:

[
{
title: 'Snow in Paradise',
year: 2014,
score: 6.7722930908203125,
highlights: [
{
score: 1.382846713066101,
path: 'title',
texts: [
{ value: 'Snow', type: 'hit' },
{ value: ' in Paradise', type: 'text' }
]
}
]
},
{
title: 'Snow on the Blades',
year: 2014,
score: 6.063445568084717,
highlights: [
{
score: 1.3766303062438965,
path: 'title',
texts: [
{ value: 'Snow', type: 'hit' },
{ value: ' on the Blades', type: 'text' }
]
}
]
},
{
title: 'The Snow White Murder Case',
year: 2014,
score: 5.509652137756348,
highlights: [
{
score: 1.3525336980819702,
path: 'title',
texts: [
{ value: 'The ', type: 'text' },
{ value: 'Snow', type: 'hit' },
{ value: ' White Murder Case', type: 'text' }
]
}
]
},
{
title: 'Dead Snow 2: Red vs. Dead',
year: 2014,
score: 5.065053939819336,
highlights: [
{
score: 1.3924485445022583,
path: 'title',
texts: [
{ value: 'Dead ', type: 'text' },
{ value: 'Snow', type: 'hit' },
{ value: ' 2: Red vs. ', type: 'text' }
]
}
]
},
{ year: 2013, title: 'The Secret Life of Walter Mitty', score: 1, highlights: [] },
{ title: 'Jurassic World', year: 2015, score: 1, highlights: [] },
{ title: 'Action Jackson', year: 2014, score: 1, highlights: [] },
{ year: 2013, title: 'In Secret', score: 1, highlights: [] },
{ title: 'The Stanford Prison Experiment', year: 2015, score: 1, highlights: [] },
{ year: 2014, title: 'The Giver', score: 1, highlights: [] }
]

Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción boost.

Esta query utiliza las siguientes etapas de pipeline:

  • $search para query la colección. La query utiliza las siguientes cláusulas del operador compound con la opción boost para priorizar algunos campos sobre otros:

    • must cláusula con el operador text para dar máxima prioridad al género comedy, seguido del término snow en el campo title. La opción boost aplica ponderaciones a los campos.

    • should cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

    Nota

    La opción boost aplica diferentes pesos a los campos para priorizarlos.

  • $limit etapa para limitar la salida a 10 resultados.

  • $project preparar para:

    • Excluir todos los campos excepto title, year y genres

    • Agrega un campo score

db.movies.aggregate([
{
"$search": {
"index": "default",
"compound": {
"must": [{
"text": {
"path": "genres",
"query": "comedy",
"score": {"boost": {"value": 9}}
}
},
{
"text": {
"path": "title",
"query": "snow",
"score": {"boost": {"value": 5}}
}
}],
"should": [{
"range": {
"path": "year",
"gte": 2013,
"lte": 2015,
"score": {"boost": {"value": 3}}
}
}]
}
}
},
{
"$limit": 10
},
{
"$project": {
"_id": 0,
"title": 1,
"year": 1,
"genres": 1,
"score": { "$meta": "searchScore" }
}
}
])
[
{
genres: [ 'Comedy', 'Horror' ],
title: 'Dead Snow',
year: 2009,
score: 21.872983932495117
},
{
year: 2000,
genres: [ 'Adventure', 'Comedy', 'Family' ],
title: 'Snow Day',
score: 21.043487548828125
},
{
genres: [ 'Adventure', 'Comedy', 'Family' ],
title: 'Snow Dogs',
year: 2002,
score: 21.043487548828125
},
{
year: 1999,
genres: [ 'Comedy', 'Romance' ],
title: 'Let It Snow',
score: 19.523927688598633
},
{
genres: [ 'Action', 'Comedy', 'Horror' ],
title: 'Dead Snow 2: Red vs. Dead',
year: 2014,
score: 17.426334381103516
},
{
genres: [ 'Comedy', 'Drama' ],
title: 'Snow White and Russian Red',
year: 2009,
score: 16.367326736450195
},
{
genres: [ 'Comedy', 'Drama', 'Romance' ],
title: 'The Tiger and the Snow',
year: 2005,
score: 15.537829399108887
},
{
genres: [ 'Adventure', 'Comedy', 'Family' ],
title: 'Snow White and the Three Stooges',
year: 1961,
score: 14.4263334274292
}
]

Esta query utiliza las siguientes etapas de pipeline:

  • $search para query la colección. La query:

    • Usa las siguientes cláusulas del operador compound:

      • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción function. La opción function añade lo siguiente mediante una expresión aritmética:

        • La puntuación de relevancia de la query para el término de búsqueda

        • El valor del campo numérico denominado imdb.rating o el número 2 para aquellos documentos que no tienen el campo imdb.rating.

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

  • $limit etapa para limitar la salida a 10 resultados.

  • $project preparar para:

    • Excluir todos los campos salvo title y year

    • Agrega un campo score

db.movies.aggregate([
{
"$search": {
"index": "default",
"compound": {
"must": [{
"range": {
"path": "year",
"gte": 2013,
"lte": 2015
}
}],
"should": [{
"text": {
"query": "snow",
"path": "title",
"score": {
"function": {
"add": [{
"path": {
"value": "imdb.rating",
"undefined": 2
}
},
{
"score": "relevance"
}]
}
}
}
}]
},
"highlight": {
"path": "title"
}
}
},
{
"$limit": 10
},
{
"$project": {
"_id": 0,
"title": 1,
"year": 1,
"score": { "$meta": "searchScore" },
"highlights": { "$meta": "searchHighlights" }
}
}
])

MongoDB Search devuelve los siguientes resultados para function:

[
{
title: 'The Snow White Murder Case',
year: 2014,
score: 10.454826354980469,
highlights: [
{
score: 1.3525336980819702,
path: 'title',
texts: [
{ value: 'The ', type: 'text' },
{ value: 'Snow', type: 'hit' },
{ value: ' White Murder Case', type: 'text' }
]
}
]
},
{
title: 'Snow on the Blades',
year: 2014,
score: 10.3317232131958,
highlights: [
{
score: 1.3766303062438965,
path: 'title',
texts: [
{ value: 'Snow', type: 'hit' },
{ value: ' on the Blades', type: 'text' }
]
}
]
},
{
title: 'Dead Snow 2: Red vs. Dead',
year: 2014,
score: 10.032526969909668,
highlights: [
{
score: 1.3924485445022583,
path: 'title',
texts: [
{ value: 'Dead ', type: 'text' },
{ value: 'Snow', type: 'hit' },
{ value: ' 2: Red vs. ', type: 'text' }
]
}
]
},
{
title: 'Snow in Paradise',
year: 2014,
score: 8.386146545410156,
highlights: [
{
score: 1.382846713066101,
path: 'title',
texts: [
{ value: 'Snow', type: 'hit' },
{ value: ' in Paradise', type: 'text' }
]
}
]
},
{ year: 2013, title: 'The Secret Life of Walter Mitty', score: 1, highlights: [] },
{ title: 'Jurassic World', year: 2015, score: 1, highlights: [] },
{ title: 'Action Jackson', year: 2014, score: 1, highlights: [] },
{ year: 2013, title: 'In Secret', score: 1, highlights: [] },
{ title: 'The Stanford Prison Experiment', year: 2015, score: 1, highlights: [] },
{ year: 2014, title: 'The Giver', score: 1, highlights: [] }
]

Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción function.

1

Abrir MongoDB Compass y realizar la conexión al clúster. Para obtener instrucciones detalladas sobre cómo realizar la conexión, se debe consultar Conectarse a un clúster a través de Compass.

2

En la pantalla Database, haz clic en la base de datos sample_mflix, luego haz clic en la colección movies.

3

La query realiza las siguientes tareas:

  • Usa las siguientes cláusulas del operador compound:

    • filter cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

    • should cláusula con el texto operador para consultar el término snow en el campo title y alterar el score con la opción constant. La opción constant reemplaza todos los resultados de puntuación para el término de búsqueda con 5.

  • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

  • Utiliza las siguientes etapas de pipeline:

    • Etapa $limit para limitar la salida a 10 resultados

    • $project etapa para:

      • Excluir todos los campos salvo title y year

      • Agrega dos campos denominados score y highlights

Para ejecutar esta query en MongoDB Compass:

  1. Haz clic en la pestaña Aggregations.

  2. Haz clic en Select..., y luego configura cada una de las siguientes etapas del pipeline seleccionando la etapa del menú desplegable y añadiendo la query para esa etapa. Haz clic en Add Stage para agregar etapas adicionales.

    etapa de pipeline
    Query

    $search

    {
    "index": "default",
    "compound": {
    "filter": [{
    "range": {
    "path": "year",
    "gte": 2013,
    "lte": 2015
    }
    }],
    "should": [{
    "text": {
    "query": "snow",
    "path": "title",
    "score": {"constant": {"value": 5}}
    }
    }]
    },
    "highlight": { "path": "title" }
    }

    $limit

    10

    $project

    {
    "_id": 0,
    "title": 1,
    "year": 1,
    "score": { "$meta": "searchScore" },
    "highlights": { "$meta": "searchHighlights" }
    }

    Si se habilita Auto Preview, MongoDB Compass muestra los siguientes documentos junto a la etapa de pipeline $project:

    {
    title: 'Snow in Paradise',
    year: 2014,
    score: 5,
    highlights: [{
    score: 1.382846713066101,
    path: 'title',
    texts: [
    { value: 'Snow', type: 'hit' },
    { value: ' in Paradise', type: 'text' }
    ]
    }]
    },
    {
    title: 'Dead Snow 2: Red vs. Dead',
    year: 2014,
    score: 5,
    highlights: [{
    score: 1.3924485445022583,
    path: 'title',
    texts: [
    { value: 'Dead ', type: 'text' },
    { value: 'Snow', type: 'hit' },
    { value: ' 2: Red vs. ', type: 'text' }
    ]
    }]
    },
    {
    title: 'The Snow White Murder Case',
    year: 2014,
    score: 5,
    highlights: [{
    score: 1.3525336980819702,
    path: 'title',
    texts: [
    { value: 'The ', type: 'text' },
    { value: 'Snow', type: 'hit' },
    { value: ' White Murder Case', type: 'text' }
    ]
    }]
    },
    {
    title: 'Snow on the Blades',
    year: 2014,
    score: 5,
    highlights: [{
    score: 1.3766303062438965,
    path: 'title',
    texts: [
    { value: 'Snow', type: 'hit' },
    { value: ' on the Blades', type: 'text' }
    ]
    }]
    },
    { year: 2013, title: 'The Secret Life of Walter Mitty', score: 0, highlights: [] },
    { title: 'Jurassic World', year: 2015, score: 0, highlights: [] },
    { title: 'Action Jackson', year: 2014, score: 0, highlights: [] },
    { year: 2013, title: 'In Secret', score: 0, highlights: [] },
    { title: 'The Stanford Prison Experiment', year: 2015, score: 0, highlights: [] },
    { year: 2014, title: 'The Giver', score: 0, highlights: [] }

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción constant.

4
  1. Haz clic en la pestaña Aggregations.

  2. Haz clic en Select..., y luego configura cada una de las siguientes etapas del pipeline seleccionando la etapa del menú desplegable y añadiendo la query para esa etapa. Haz clic en Add Stage para agregar etapas adicionales.

    La consulta utiliza las siguientes etapas del pipeline:

    • $search para realizar las siguientes tareas:

      • Consultas que utilizan las siguientes cláusulas de operador compound:

        • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

        • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción boost. La opción boost multiplica la puntuación base en los resultados para el término de búsqueda por 2.

      • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Etapa $limit para limitar la salida a 10 resultados

    • $project etapa para:

      • Excluir todos los campos salvo title y year

      • Agrega dos campos denominados score y highlights

    etapa de pipeline
    Query

    $search

    {
    "index": "default",
    "compound": {
    "must": [{
    "range": {
    "path": "year",
    "gte": 2013,
    "lte": 2015
    }
    }],
    "should": [{
    "text": {
    "query": "snow",
    "path": "title",
    "score": {"boost": {"value": 2}}
    }
    }]
    },
    "highlight": { "path": "title" }
    }

    $limit

    10

    $project

    {
    "_id": 0,
    "title": 1,
    "year": 1,
    "score": { "$meta": "searchScore" },
    "highlights": { "$meta": "searchHighlights" }
    }

    Esta query utiliza las siguientes etapas de pipeline:

    • $search para realizar las siguientes tareas:

      • Consultas que utilizan las cláusulas de operador compound con la opción boost para priorizar algunos campos más que otros:

        • must cláusula con el operador text para dar máxima prioridad al género comedy, seguido del término snow en el campo title. La opción boost aplica ponderaciones a los campos.

        • should cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

        Nota

        La opción boost aplica diferentes pesos a los campos para priorizarlos.

    • Etapa $limit para limitar la salida a 10 resultados

    • $project etapa para:

      • Excluir todos los campos salvo title y year

      • Agrega dos campos denominados score y highlights

    • must cláusula con el operador text para dar máxima prioridad al género comedy, seguido del término snow en el campo title. La opción boost aplica ponderaciones a los campos.

    • should cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

    Nota

    La opción boost aplica diferentes pesos a los campos para priorizarlos.

    etapa de pipeline
    Query

    $search

    {
    "index": "default",
    "compound": {
    "must": [{
    "text": {
    "path": "genres",
    "query": "comedy",
    "score": {"boost": {"value": 9}}
    }
    },
    {
    "text": {
    "path": "title",
    "query": "snow",
    "score": {"boost": {"value": 5}}
    }
    }],
    "should": [{
    "range": {
    "path": "year",
    "gte": 2013,
    "lte": 2015,
    "score": {"boost": {"value": 3}}
    }
    }]
    }
    }

    $limit

    10

    $project

    {
    "_id": 0,
    "title": 1,
    "year": 1,
    "genres": 1,
    "score": { "$meta": "searchScore" }
    }

    Si se habilita Auto Preview, MongoDB Compass muestra los siguientes documentos junto a la etapa de pipeline $project:

    {
    title: 'Snow in Paradise',
    year: 2014,
    score: 6.7722930908203125,
    highlights: [{
    score: 1.382846713066101,
    path: 'title',
    texts: [
    { value: 'Snow', type: 'hit' },
    { value: ' in Paradise', type: 'text' }
    ]
    }]
    },
    {
    title: 'Snow on the Blades',
    year: 2014,
    score: 6.063445568084717,
    highlights: [{
    score: 1.3766303062438965,
    path: 'title',
    texts: [
    { value: 'Snow', type: 'hit' },
    { value: ' on the Blades', type: 'text' }
    ]
    }]
    },
    {
    title: 'The Snow White Murder Case',
    year: 2014,
    score: 5.509652137756348,
    highlights: [{
    score: 1.3525336980819702,
    path: 'title',
    texts: [
    { value: 'The ', type: 'text' },
    { value: 'Snow', type: 'hit' },
    { value: ' White Murder Case', type: 'text' }
    ]
    }]
    },
    {
    title: 'Dead Snow 2: Red vs. Dead',
    year: 2014,
    score: 5.065053939819336,
    highlights: [{
    score: 1.3924485445022583,
    path: 'title',
    texts: [
    { value: 'Dead ', type: 'text' },
    { value: 'Snow', type: 'hit' },
    { value: ' 2: Red vs. ', type: 'text' }
    ]
    }]
    },
    { year: 2013, title: 'The Secret Life of Walter Mitty',score: 1, highlights: [] },
    { title: 'Jurassic World', year: 2015, score: 1, highlights: [] },
    { title: 'Action Jackson', year: 2014, score: 1, highlights: [] },
    { year: 2013, title: 'In Secret', score: 1, highlights: [] },
    { title: 'The Stanford Prison Experiment', year: 2015, score: 1, highlights: [] },
    { year: 2014, title: 'The Giver', score: 1, highlights: [] }

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción boost.

    [
    {
    genres: [ 'Comedy', 'Horror' ],
    title: 'Dead Snow',
    year: 2009,
    score: 21.872983932495117
    },
    {
    year: 2000,
    genres: [ 'Adventure', 'Comedy', 'Family' ],
    title: 'Snow Day',
    score: 21.043487548828125
    },
    {
    genres: [ 'Adventure', 'Comedy', 'Family' ],
    title: 'Snow Dogs',
    year: 2002,
    score: 21.043487548828125
    },
    {
    year: 1999,
    genres: [ 'Comedy', 'Romance' ],
    title: 'Let It Snow',
    score: 19.523927688598633
    },
    {
    genres: [ 'Action', 'Comedy', 'Horror' ],
    title: 'Dead Snow 2: Red vs. Dead',
    year: 2014,
    score: 17.426334381103516
    },
    {
    genres: [ 'Comedy', 'Drama' ],
    title: 'Snow White and Russian Red',
    year: 2009,
    score: 16.367326736450195
    },
    {
    genres: [ 'Comedy', 'Drama', 'Romance' ],
    title: 'The Tiger and the Snow',
    year: 2005,
    score: 15.537829399108887
    },
    {
    genres: [ 'Adventure', 'Comedy', 'Family' ],
    title: 'Snow White and the Three Stooges',
    year: 1961,
    score: 14.4263334274292
    }
    ]
5

La consulta utiliza las siguientes etapas del pipeline:

  • $search etapa para realizar las siguientes tareas:

    • Consultas que utilizan las siguientes cláusulas de operador compound:

      • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción function. La opción function añade lo siguiente mediante una expresión aritmética:

        • La puntuación de relevancia de la query para el término de búsqueda

        • El valor del campo numérico denominado imdb.rating o el número 2 para aquellos documentos que no tienen el campo imdb.rating.

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

  • Etapa $limit para limitar la salida a 10 resultados

  • $project etapa para:

    • Excluir todos los campos salvo title y year

    • Agrega dos campos denominados score y highlights

Para ejecutar esta query en MongoDB Compass:

  1. Haz clic en la pestaña Aggregations.

  2. Haz clic en Select..., y luego configura cada una de las siguientes etapas del pipeline seleccionando la etapa del menú desplegable y añadiendo la query para esa etapa. Haz clic en Add Stage para agregar etapas adicionales.

    etapa de pipeline
    Query

    $search

    {
    "index": "default",
    "compound": {
    "must": [{
    "range": {
    "path": "year",
    "gte": 2013,
    "lte": 2015
    }
    }],
    "should": [{
    "text": {
    "query": "snow",
    "path": "title",
    "score": {
    "function": {
    "add": [{
    "path": {
    "value": "imdb.rating",
    "undefined": 2
    }
    },
    {
    "score": "relevance"
    }]
    }
    }
    }
    }]},
    "highlight":{ "path": "title" }
    }

    $limit

    10

    $project

    {
    "_id": 0,
    "title": 1,
    "year": 1,
    "score": { "$meta": "searchScore" },
    "highlights": { "$meta": "searchHighlights" }
    }

    Si se habilita Auto Preview, MongoDB Compass muestra los siguientes documentos junto a la etapa de pipeline $project:

    {
    title: 'The Snow White Murder Case',
    year: 2014,
    score: 10.454826354980469,
    highlights: [{
    score: 1.3525336980819702,
    path: 'title',
    texts: [
    { value: 'The ', type: 'text' },
    { value: 'Snow', type: 'hit' },
    { value: ' White Murder Case', type: 'text' }
    ]
    }]
    },
    {
    title: 'Snow on the Blades',
    year: 2014,
    score: 10.3317232131958,
    highlights: [{
    score: 1.3766303062438965,
    path: 'title',
    texts: [
    { value: 'Snow', type: 'hit' },
    { value: ' on the Blades', type: 'text' }
    ]
    }]
    },
    {
    title: 'Dead Snow 2: Red vs. Dead',
    year: 2014,
    score: 10.032526969909668,
    highlights: [{
    score: 1.3924485445022583,
    path: 'title',
    texts: [
    { value: 'Dead ', type: 'text' },
    { value: 'Snow', type: 'hit' },
    { value: ' 2: Red vs. ', type: 'text' }
    ]
    }]
    },
    {
    title: 'Snow in Paradise',
    year: 2014,
    score: 8.386146545410156,
    highlights: [{
    score: 1.382846713066101,
    path: 'title',
    texts: [
    { value: 'Snow', type: 'hit' },
    { value: ' in Paradise', type: 'text' }
    ]
    }]
    },
    { year: 2013, title: 'The Secret Life of Walter Mitty', score: 1, highlights: [] },
    { title: 'Jurassic World', year: 2015, score: 1, highlights: [] },
    { title: 'Action Jackson', year: 2014, score: 1, highlights: [] },
    { year: 2013, title: 'In Secret', score: 1, highlights: [] },
    { title: 'The Stanford Prison Experiment', year: 2015, score: 1, highlights: [] },
    { year: 2014, title: 'The Giver', score: 1, highlights: [] }

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción function.

1
  1. Crea un nuevo directorio llamado compound-constant-example e inicializa tu proyecto con el comando dotnet new.

    mkdir compound-constant-example
    cd compound-constant-example
    dotnet new console
  2. Agrega el driver .NET/C# a tu proyecto como una dependencia.

    dotnet add package MongoDB.Driver
  3. Reemplace el contenido del archivo Program.cs con el siguiente código.

    El ejemplo de código realiza las siguientes tareas:

    • Importa los paquetes y dependencias de mongodb.

    • Establece una conexión a tu clúster.

    • Utiliza las siguientes cláusulas compuestas para consultar la colección:

      • filter cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el texto operador para consultar el término snow en el campo title y alterar el score con la opción constant. La opción constant reemplaza todos los resultados de puntuación para el término de búsqueda con 5.

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Utiliza las siguientes etapas de pipeline:

      • Etapa $limit para limitar la salida a 10 resultados

      • $project etapa para:

        • Excluir todos los campos salvo title y year

        • Agrega dos campos denominados score y highlights

    • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public class CompoundConstantExample
    8{
    9 private const string MongoConnectionString = "<connection-string>";
    10
    11 public static void Main(string[] args)
    12 {
    13 // allow automapping of the camelCase database fields to our MovieDocument
    14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
    15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
    16
    17 // connect to your Atlas cluster
    18 var mongoClient = new MongoClient(MongoConnectionString);
    19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    21
    22 // define and run pipeline
    23 var results = moviesCollection.Aggregate()
    24 .Search(Builders<MovieDocument>.Search.Compound()
    25 .Filter(Builders<MovieDocument>.Search.Range(movie => movie.Year, SearchRangeBuilder.Gte(2013).Lte(2015)))
    26 .Should(Builders<MovieDocument>.Search.Text(movie => movie.Title, "snow", score: new SearchScoreDefinitionBuilder<MovieDocument>().Constant(5))),
    27 new SearchHighlightOptions<MovieDocument>(movie => movie.Title),
    28 indexName: "default")
    29 .Project<MovieDocument>(Builders<MovieDocument>.Projection
    30 .Include(movie => movie.Title)
    31 .Include(movie => movie.Year)
    32 .Exclude(movie => movie.Id)
    33 .MetaSearchScore(movie => movie.Score)
    34 .MetaSearchHighlights("highlights"))
    35 .Limit(10)
    36 .ToList();
    37
    38 // print results
    39 foreach (var movie in results)
    40 {
    41 Console.WriteLine(movie.ToJson());
    42 }
    43 }
    44}
    45
    46[BsonIgnoreExtraElements]
    47public class MovieDocument
    48{
    49 [BsonIgnoreIfDefault]
    50 public ObjectId Id { get; set; }
    51 public string Title { get; set; }
    52 public int Year { get; set; }
    53 [BsonElement("highlights")]
    54 public List<SearchHighlight> Highlights { get; set; }
    55 public double Score { get; set; }
    56}
  4. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  5. Compila y ejecuta el archivo Program.cs:

    dotnet run compound-constant-example.csproj
    {
    "title" : "Snow in Paradise",
    "year" : 2014,
    "highlights" : [{
    "path" : "title",
    "score" : 1.3828467130661011,
    "texts" : [{ "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " in Paradise" }]
    }],
    "score" : 5.0
    }
    {
    "title" : "Dead Snow 2: Red vs. Dead",
    "year" : 2014,
    "highlights" : [{
    "path" : "title",
    "score" : 1.3924485445022583,
    "texts" : [{ "type" : "Text", "value" : "Dead " }, { "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " 2: Red vs. " }]
    }],
    "score" : 5.0
    }
    {
    "title" : "The Snow White Murder Case",
    "year" : 2014,
    "highlights" : [{
    "path" : "title",
    "score" : 1.3525336980819702,
    "texts" : [{ "type" : "Text", "value" : "The " }, { "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " White Murder Case" }]
    }],
    "score" : 5.0
    }
    {
    "title" : "Snow on the Blades",
    "year" : 2014,
    "highlights" : [{
    "path" : "title",
    "score" : 1.3766303062438965,
    "texts" : [{ "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " on the Blades" }]
    }],
    "score" : 5.0
    }
    { "title" : "The Secret Life of Walter Mitty", "year" : 2013, "highlights" : [], "score" : 0.0 }
    { "title" : "Jurassic World", "year" : 2015, "highlights" : [], "score" : 0.0 }
    { "title" : "Action Jackson", "year" : 2014, "highlights" : [], "score" : 0.0 }
    { "title" : "In Secret", "year" : 2013, "highlights" : [], "score" : 0.0 }
    { "title" : "The Stanford Prison Experiment", "year" : 2015, "highlights" : [], "score" : 0.0 }
    { "title" : "The Giver", "year" : 2014, "highlights" : [], "score" : 0.0 }

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción constant.

2
  1. Crea un nuevo directorio llamado compound-boost-example e inicializa tu proyecto con el comando dotnet new.

    mkdir compound-boost-example
    cd compound-boost-example
    dotnet new console
  2. Agrega el driver .NET/C# a tu proyecto como una dependencia.

    dotnet add package MongoDB.Driver
  3. Reemplace el contenido del archivo Program.cs con el siguiente código.

    El ejemplo de código realiza las siguientes tareas:

    • Importa los paquetes y dependencias de mongodb.

    • Establece una conexión a tu clúster.

    • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

    La consulta utiliza las siguientes etapas del pipeline:

    • $search etapa para hacer queries a la colección. La query:

      • Usa las siguientes cláusulas del operador compound:

        • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

        • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción boost. La opción boost multiplica la puntuación base en los resultados para el término de búsqueda por 2.

      Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Etapa $limit para limitar la salida a 10 resultados

    • $project etapa para:

      • Excluir todos los campos salvo title y year

      • Agrega dos campos denominados score y highlights

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public class CompoundBoostSingleExample
    8{
    9 private const string MongoConnectionString = "<connection-string>";
    10
    11 public static void Main(string[] args)
    12 {
    13 // allow automapping of the camelCase database fields to our MovieDocument
    14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
    15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
    16
    17 // connect to your Atlas cluster
    18 var mongoClient = new MongoClient(MongoConnectionString);
    19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    21
    22 // define and run pipeline
    23 var results = moviesCollection.Aggregate()
    24 .Search(Builders<MovieDocument>.Search.Compound()
    25 .Must(Builders<MovieDocument>.Search.Range(movie => movie.Year, SearchRangeBuilder.Gte(2013).Lte(2015)))
    26 .Should(Builders<MovieDocument>.Search.Text(movie => movie.Title, "snow", score: new SearchScoreDefinitionBuilder<MovieDocument>().Boost(2))),
    27 new SearchHighlightOptions<MovieDocument>(movie => movie.Title),
    28 indexName: "default")
    29 .Project<MovieDocument>(Builders<MovieDocument>.Projection
    30 .Include(movie => movie.Title)
    31 .Include(movie => movie.Year)
    32 .Exclude(movie => movie.Id)
    33 .MetaSearchScore(movie => movie.Score)
    34 .MetaSearchHighlights("highlights"))
    35 .Limit(10)
    36 .ToList();
    37
    38 // print results
    39 foreach (var movie in results)
    40 {
    41 Console.WriteLine(movie.ToJson());
    42 }
    43 }
    44}
    45
    46[BsonIgnoreExtraElements]
    47public class MovieDocument
    48{
    49 [BsonIgnoreIfDefault]
    50 public ObjectId Id { get; set; }
    51 public string Title { get; set; }
    52 public int Year { get; set; }
    53 [BsonElement("highlights")]
    54 public List<SearchHighlight> Highlights { get; set; }
    55 public double Score { get; set; }
    56}

    Esta query utiliza las siguientes cláusulas del operador compound con la opción boost para priorizar algunos campos más que otros campos:

    • must cláusula con el operador text para dar máxima prioridad al género comedy, seguido del término snow en el campo title. La opción boost aplica ponderaciones a los campos.

    • should cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

    Nota

    La opción boost aplica diferentes pesos a los campos para priorizarlos.

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public class CompoundBoostMultipleExample
    8{
    9 private const string MongoConnectionString = "<connection-string>";
    10
    11 public static void Main(string[] args)
    12 {
    13 // allow automapping of the camelCase database fields to our MovieDocument
    14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
    15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
    16
    17 // connect to your Atlas cluster
    18 var mongoClient = new MongoClient(MongoConnectionString);
    19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    21
    22 // define and run pipeline
    23 var results = moviesCollection.Aggregate()
    24 .Search(Builders<MovieDocument>.Search.Compound()
    25 .Must(Builders<MovieDocument>.Search.Text(movie => movie.Genres, "comedy", score: new SearchScoreDefinitionBuilder<MovieDocument>().Boost(9)))
    26 .Must(Builders<MovieDocument>.Search.Text(movie => movie.Title, "snow", score: new SearchScoreDefinitionBuilder<MovieDocument>().Boost(5)))
    27 .Should(Builders<MovieDocument>.Search.Range(movie => movie.Year, SearchRangeBuilder.Gte(2013).Lte(2015), score: new SearchScoreDefinitionBuilder<MovieDocument>().Boost(3))),
    28 indexName: "default")
    29 .Project<MovieDocument>(Builders<MovieDocument>.Projection
    30 .Include(movie => movie.Genres)
    31 .Include(movie => movie.Title)
    32 .Include(movie => movie.Year)
    33 .Exclude(movie => movie.Id)
    34 .MetaSearchScore(movie => movie.Score))
    35 .Limit(10)
    36 .ToList();
    37
    38 // print results
    39 foreach (var movie in results)
    40 {
    41 Console.WriteLine(movie.ToJson());
    42 }
    43 }
    44}
    45
    46[BsonIgnoreExtraElements]
    47public class MovieDocument
    48{
    49 [BsonIgnoreIfDefault]
    50 public ObjectId Id { get; set; }
    51 public string [] Genres { get; set; }
    52 public string Title { get; set; }
    53 public int Year { get; set; }
    54 public double Score { get; set; }
    55}
  4. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  5. Compila y ejecuta el archivo Program.cs:

    dotnet run compound-boost-example.csproj
    {
    "title" : "Snow in Paradise",
    "year" : 2014,
    "highlights" : [{
    "path" : "title",
    "score" : 1.3828467130661011,
    "texts" : [{ "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " in Paradise" }]
    }],
    "score" : 6.7722930908203125
    }
    {
    "title" : "Snow on the Blades",
    "year" : 2014,
    "highlights" : [{
    "path" : "title",
    "score" : 1.3766303062438965,
    "texts" : [{ "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " on the Blades" }]
    }],
    "score" : 6.0634455680847168
    }
    {
    "title" : "The Snow White Murder Case",
    "year" : 2014,
    "highlights" : [{
    "path" : "title",
    "score" : 1.3525336980819702,
    "texts" : [{ "type" : "Text", "value" : "The " }, { "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " White Murder Case" }]
    }],
    "score" : 5.5096521377563477
    }
    {
    "title" : "Dead Snow 2: Red vs. Dead",
    "year" : 2014,
    "highlights" : [{
    "path" : "title",
    "score" : 1.3924485445022583,
    "texts" : [{ "type" : "Text", "value" : "Dead " }, { "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " 2: Red vs. " }]
    }],
    "score" : 5.0650539398193359
    }
    { "title" : "The Secret Life of Walter Mitty", "year" : 2013, "highlights" : [], "score" : 1.0 }
    { "title" : "Jurassic World", "year" : 2015, "highlights" : [], "score" : 1.0 }
    { "title" : "Action Jackson", "year" : 2014, "highlights" : [], "score" : 1.0 }
    { "title" : "In Secret", "year" : 2013, "highlights" : [], "score" : 1.0 }
    { "title" : "The Stanford Prison Experiment", "year" : 2015, "highlights" : [], "score" : 1.0 }
    { "title" : "The Giver", "year" : 2014, "highlights" : [], "score" : 1.0 }

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción boost.

    dotnet run compound-boost-example.csproj
    { "genres" : ["Comedy", "Horror"], "title" : "Dead Snow", "year" : 2009, "score" : 21.872983932495117 }
    { "genres" : ["Adventure", "Comedy", "Family"], "title" : "Snow Day", "year" : 2000, "score" : 21.043487548828125 }
    { "genres" : ["Adventure", "Comedy", "Family"], "title" : "Snow Dogs", "year" : 2002, "score" : 21.043487548828125 }
    { "genres" : ["Comedy", "Romance"], "title" : "Let It Snow", "year" : 1999, "score" : 19.523927688598633 }
    { "genres" : ["Action", "Comedy", "Horror"], "title" : "Dead Snow 2: Red vs. Dead", "year" : 2014, "score" : 17.426334381103516 }
    { "genres" : ["Comedy", "Drama"], "title" : "Snow White and Russian Red", "year" : 2009, "score" : 16.367326736450195 }
    { "genres" : ["Comedy", "Drama", "Romance"], "title" : "The Tiger and the Snow", "year" : 2005, "score" : 15.537829399108887 }
    { "genres" : ["Adventure", "Comedy", "Family"], "title" : "Snow White and the Three Stooges", "year" : 1961, "score" : 14.426333427429199 }
3
  1. Crea un nuevo directorio llamado compound-function-example e inicializa tu proyecto con el comando dotnet new.

    mkdir compound-function-example
    cd compound-function-example
    dotnet new console
  2. Agrega el driver .NET/C# a tu proyecto como una dependencia.

    dotnet add package MongoDB.Driver
  3. Reemplace el contenido del archivo Program.cs con el siguiente código.

    El ejemplo de código realiza las siguientes tareas:

    • Importa los paquetes y dependencias de mongodb.

    • Establece una conexión a tu clúster.

    • Utiliza las siguientes etapas de la pipeline para query la colección:

      • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción function. La opción function añade lo siguiente mediante una expresión aritmética:

        • La puntuación de relevancia de la query para el término de búsqueda

        • El valor del campo numérico denominado imdb.rating o el número 2 para aquellos documentos que no tienen el campo imdb.rating.

    • Utiliza las siguientes etapas de pipeline:

      • Etapa $limit para limitar la salida a 10 resultados

      • $project etapa para:

        • Excluir todos los campos salvo title y year

        • Agrega dos campos denominados score y highlights

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public class CompoundFunctionExample
    8{
    9 private const string MongoConnectionString = "<connection-string>";
    10
    11 public static void Main(string[] args)
    12 {
    13 // allow automapping of the camelCase database fields to our MovieDocument
    14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
    15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
    16
    17 // connect to your Atlas cluster
    18 var mongoClient = new MongoClient(MongoConnectionString);
    19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    21
    22 var scoreFunction = Builders<MovieDocument>.SearchScore.Function(Builders<MovieDocument>.SearchScoreFunction.Add(Builders<MovieDocument>.SearchScoreFunction.Path(movie => movie.Imdb.Rating, 2), Builders<MovieDocument>.SearchScoreFunction.Relevance()));
    23 // define and run pipeline
    24 var results = moviesCollection.Aggregate()
    25 .Search(Builders<MovieDocument>.Search.Compound()
    26 .Must(Builders<MovieDocument>.Search.Range(movie => movie.Year, SearchRangeBuilder.Gte(2013).Lte(2015)))
    27 .Should(Builders<MovieDocument>.Search.Text(movie => movie.Title, "snow", score: scoreFunction)),
    28 new SearchHighlightOptions<MovieDocument>(movie => movie.Title),
    29 indexName: "default")
    30 .Project<MovieDocument>(Builders<MovieDocument>.Projection
    31 .Include(movie => movie.Genres)
    32 .Include(movie => movie.Title)
    33 .Include(movie => movie.Year)
    34 .Exclude(movie => movie.Id)
    35 .MetaSearchScore(movie => movie.Score)
    36 .MetaSearchHighlights("highlights"))
    37 .Limit(10)
    38 .ToList();
    39
    40 // print results
    41 foreach (var movie in results)
    42 {
    43 Console.WriteLine(movie.ToJson());
    44 }
    45 }
    46}
    47
    48[BsonIgnoreExtraElements]
    49public class MovieDocument
    50{
    51 [BsonIgnoreIfDefault]
    52 public ObjectId Id { get; set; }
    53 public string [] Genres { get; set; }
    54 public IMDB Imdb { get; set; }
    55 public string Title { get; set; }
    56 public int Year { get; set; }
    57 [BsonElement("highlights")]
    58 public List<SearchHighlight> Highlights { get; set; }
    59 public double Score { get; set; }
    60}
    61
    62[BsonIgnoreExtraElements]
    63public class IMDB
    64{
    65 public double Rating { get; set; }
    66}
  4. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  5. Compila y ejecuta el archivo Program.cs:

    dotnet run compound-function-example.csproj
    { "genres" : ["Drama", "Mystery"], "title" : "The Snow White Murder Case", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3525336980819702, "texts" : [{ "type" : "Text", "value" : "The " }, { "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " White Murder Case" }] }], "score" : 10.454826354980469 }
    { "genres" : ["Action", "Drama", "History"], "title" : "Snow on the Blades", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3766303062438965, "texts" : [{ "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " on the Blades" }] }], "score" : 10.331723213195801 }
    { "genres" : ["Action", "Comedy", "Horror"], "title" : "Dead Snow 2: Red vs. Dead", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3924485445022583, "texts" : [{ "type" : "Text", "value" : "Dead " }, { "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " 2: Red vs. " }] }], "score" : 10.032526969909668 }
    { "genres" : ["Thriller"], "title" : "Snow in Paradise", "year" : 2014, "highlights" : [{ "path" : "title", "score" : 1.3828467130661011, "texts" : [{ "type" : "Hit", "value" : "Snow" }, { "type" : "Text", "value" : " in Paradise" }] }], "score" : 8.3861465454101562 }
    { "genres" : ["Adventure", "Comedy", "Drama"], "title" : "The Secret Life of Walter Mitty", "year" : 2013, "highlights" : [], "score" : 1.0 }
    { "genres" : ["Action", "Adventure", "Sci-Fi"], "title" : "Jurassic World", "year" : 2015, "highlights" : [], "score" : 1.0 }
    { "genres" : ["Action", "Comedy", "Drama"], "title" : "Action Jackson", "year" : 2014, "highlights" : [], "score" : 1.0 }
    { "genres" : ["Crime", "Drama", "Thriller"], "title" : "In Secret", "year" : 2013, "highlights" : [], "score" : 1.0 }
    { "genres" : ["Drama", "Thriller"], "title" : "The Stanford Prison Experiment", "year" : 2015, "highlights" : [], "score" : 1.0 }
    { "genres" : ["Drama", "Sci-Fi"], "title" : "The Giver", "year" : 2014, "highlights" : [], "score" : 1.0 }

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción function.

1
  1. Crea un archivo llamado compound-constant-query.go.

  2. Copia y pega el ejemplo de código en el archivo compound-constant-query.go.

    El ejemplo de código realiza las siguientes tareas:

    • Importa los paquetes y dependencias de mongodb.

    • Establece una conexión a tu clúster.

    • Utiliza las siguientes cláusulas compuestas para consultar la colección:

      • filter cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el texto operador para consultar el término snow en el campo title y alterar el score con la opción constant. La opción constant reemplaza todos los resultados de puntuación para el término de búsqueda con 5.

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Utiliza las siguientes etapas de pipeline:

      • Etapa $limit para limitar la salida a 10 resultados

      • $project etapa para:

        • Excluir todos los campos salvo title y year

        • Agrega dos campos denominados score y highlights

    • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

    1package main
    2
    3import (
    4 "context"
    5 "fmt"
    6 "time"
    7
    8 "go.mongodb.org/mongo-driver/v2/bson"
    9 "go.mongodb.org/mongo-driver/v2/mongo"
    10 "go.mongodb.org/mongo-driver/v2/mongo/options"
    11)
    12
    13func main() {
    14 // connect to the Atlas cluster and set a maximum operation time
    15 opts := options.Client().
    16 SetTimeout(5 * time.Second).
    17 ApplyURI("<connection-string>")
    18
    19 client, err := mongo.Connect(opts)
    20 if err != nil {
    21 panic(err)
    22 }
    23 defer client.Disconnect(context.TODO())
    24
    25 // set namespace
    26 collection := client.Database("sample_mflix").Collection("movies")
    27
    28 // define pipeline stages
    29 searchStage := bson.D{{"$search", bson.M{
    30 "index": "default",
    31 "compound": bson.M{
    32 "filter": bson.M{
    33 "range": bson.M{
    34 "path": "year", "gte": 2013, "lte": 2015,
    35 },
    36 },
    37 "should": bson.D{
    38 {"text", bson.M{
    39 "path": "title", "query": "snow", "score": bson.M{
    40 "constant": bson.D{{"value", 5}},
    41 }}}},
    42 },
    43 "highlight": bson.D{{"path", "title"}},
    44 }}}
    45 limitStage := bson.D{{"$limit", 10}}
    46 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"year", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}, {"highlights", bson.D{{"$meta", "searchHighlights"}}}}}}
    47
    48 // run pipeline
    49 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage})
    50 if err != nil {
    51 panic(err)
    52 }
    53
    54 // print results
    55 var results []bson.D
    56 if err = cursor.All(context.TODO(), &results); err != nil {
    57 panic(err)
    58 }
    59 for _, result := range results {
    60 fmt.Println(result)
    61 }
    62}
  3. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  4. Ejecute el siguiente comando para consultar su colección:

    go run compound-constant-query.go
    [{title Snow in Paradise} {year 2014} {score 5} {highlights [[{score 1.382846713066101} {path title} {texts [[{value Snow} {type hit}] [{value in Paradise} {type text}]]}]]}]
    [{title Dead Snow 2: Red vs. Dead} {year 2014} {score 5} {highlights [[{score 1.3924485445022583} {path title} {texts [[{value Dead } {type text}] [{value Snow} {type hit}] [{value 2: Red vs. } {type text}]]}]]}]
    [{title The Snow White Murder Case} {year 2014} {score 5} {highlights [[{score 1.3525336980819702} {path title} {texts [[{value The } {type text}] [{value Snow} {type hit}] [{value White Murder Case} {type text}]]}]]}]
    [{title Snow on the Blades} {year 2014} {score 5} {highlights [[{score 1.3766303062438965} {path title} {texts [[{value Snow} {type hit}] [{value on the Blades} {type text}]]}]]}]
    [{year 2013} {title The Secret Life of Walter Mitty} {score 0} {highlights []}]
    [{title Jurassic World} {year 2015} {score 0} {highlights []}]
    [{title Action Jackson} {year 2014} {score 0} {highlights []}]
    [{year 2013} {title In Secret} {score 0} {highlights []}]
    [{title The Stanford Prison Experiment} {year 2015} {score 0} {highlights []}]
    [{year 2014} {title The Giver} {score 0} {highlights []}]

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción constant.

2
  1. Crea un archivo llamado compound-boost-query.go.

  2. Copia y pega el ejemplo de código en el archivo compound-boost-query.go.

    Los ejemplos de código realizan las siguientes tareas:

    • Importa los paquetes y dependencias de mongodb.

    • Establece una conexión a tu clúster.

    • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

    La consulta utiliza las siguientes etapas del pipeline:

    • $search etapa para hacer queries a la colección. La query:

      • Utiliza las siguientes cláusulas compound para consultar la colección:

        • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

        • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción boost. La opción boost multiplica la puntuación base en los resultados para el término de búsqueda por 2.

      • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Etapa $limit para limitar la salida a 10 resultados

    • $project etapa para:

      • Excluir todos los campos salvo title y year

      • Agrega dos campos denominados score y highlights

    1package main
    2
    3import (
    4 "context"
    5 "fmt"
    6 "time"
    7
    8 "go.mongodb.org/mongo-driver/v2/bson"
    9 "go.mongodb.org/mongo-driver/v2/mongo"
    10 "go.mongodb.org/mongo-driver/v2/mongo/options"
    11)
    12
    13// define structure of movies collection
    14type MovieCollection struct {
    15 title string `bson:"Title,omitempty"`
    16}
    17
    18func main() {
    19 var err error
    20 // connect to the Atlas cluster and set a maximum operation time
    21 ctx := context.Background()
    22 opts := options.Client().
    23 SetTimeout(5 * time.Second).
    24 ApplyURI("<connection-string>")
    25
    26 client, err := mongo.Connect(opts)
    27 if err != nil {
    28 panic(err)
    29 }
    30 defer client.Disconnect(ctx)
    31 // set namespace
    32 collection := client.Database("sample_mflix").Collection("movies")
    33 // define pipeline
    34 searchStage := bson.D{{"$search", bson.M{
    35 "index": "default",
    36 "compound": bson.M{
    37 "must": bson.M{
    38 "range": bson.M{
    39 "path": "year", "gte": 2013, "lte": 2015,
    40 },
    41 },
    42 "should": bson.D{
    43 {"text", bson.M{
    44 "path": "title", "query": "snow", "score": bson.M{
    45 "boost": bson.D{{"value", 2}},
    46 },
    47 }},
    48 },
    49 },
    50 }}}
    51 limitStage := bson.D{{"$limit", 10}}
    52 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"year", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}}}}
    53 // run pipeline
    54 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage})
    55 if err != nil {
    56 panic(err)
    57 }
    58 // print results
    59 var results []bson.D
    60 if err = cursor.All(context.TODO(), &results); err != nil {
    61 panic(err)
    62 }
    63 for _, result := range results {
    64 fmt.Println(result)
    65 }
    66}

    Esta query utiliza las siguientes etapas de pipeline:

    • $search etapa para hacer queries a la colección. La query:

      • Utiliza las cláusulas del operador compound con la opción boost para priorizar algunos campos más que otros:

        • must cláusula con el operador text para dar máxima prioridad al género comedy, seguido del término snow en el campo title. La opción boost aplica ponderaciones a los campos.

        • should cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

        Nota

        La opción boost aplica diferentes pesos a los campos para priorizarlos.

    • Etapa $limit para limitar la salida a 10 resultados

    • $project etapa para:

      • Excluir todos los campos salvo title y year

      • Agrega dos campos denominados score y highlights

    1package main
    2
    3import (
    4 "context"
    5 "fmt"
    6 "time"
    7
    8 "go.mongodb.org/mongo-driver/v2/bson"
    9 "go.mongodb.org/mongo-driver/v2/mongo"
    10 "go.mongodb.org/mongo-driver/v2/mongo/options"
    11)
    12
    13// define structure of movies collection
    14type MovieCollection struct {
    15 title string `bson:"Title,omitempty"`
    16}
    17
    18func main() {
    19 var err error
    20 // connect to the Atlas cluster and set a maximum operation time
    21 ctx := context.Background()
    22 opts := options.Client().
    23 SetTimeout(5 * time.Second).
    24 ApplyURI("<connection-string>")
    25
    26 client, err := mongo.Connect(opts)
    27 if err != nil {
    28 panic(err)
    29 }
    30 defer client.Disconnect(ctx)
    31 // set namespace
    32 collection := client.Database("sample_mflix").Collection("movies")
    33 // define pipeline
    34 searchStage := bson.D{{"$search", bson.M{
    35 "index": "default",
    36 "compound": bson.M{
    37 "must": bson.A{
    38 bson.M{
    39 "text": bson.M{
    40 "path": "genres", "query": "comedy", "score": bson.M{
    41 "boost": bson.D{{"value", 9}},
    42 },
    43 },
    44 },
    45 bson.M{
    46 "text": bson.M{
    47 "path": "title", "query": "snow", "score": bson.M{
    48 "boost": bson.D{{"value", 5}},
    49 },
    50 },
    51 },
    52 },
    53 "should": bson.M{
    54 "range": bson.M{
    55 "path": "year", "gte": 2013, "lte": 2015, "score": bson.M{
    56 "boost": bson.D{{"value", 3}},
    57 },
    58 },
    59 },
    60 },
    61 }}}
    62 limitStage := bson.D{{"$limit", 10}}
    63 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"year", 1}, {"genres", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}}}}
    64 // run pipeline
    65 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage})
    66 if err != nil {
    67 panic(err)
    68 }
    69 // print results
    70 var results []bson.D
    71 if err = cursor.All(context.TODO(), &results); err != nil {
    72 panic(err)
    73 }
    74 for _, result := range results {
    75 fmt.Println(result)
    76 }
    77}
  3. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  4. Ejecute el siguiente comando para consultar su colección:

    go run compound-boost-query.go
    [{title Snow in Paradise} {year 2014} {score 6.7722930908203125} {highlights [[{score 1.382846713066101} {path title} {texts [[{value Snow} {type hit}] [{value in Paradise} {type text}]]}]]}]
    [{title Snow on the Blades} {year 2014} {score 6.063445568084717} {highlights [[{score 1.3766303062438965} {path title} {texts [[{value Snow} {type hit}] [{value on the Blades} {type text}]]}]]}]
    [{title The Snow White Murder Case} {year 2014} {score 5.509652137756348} {highlights [[{score 1.3525336980819702} {path title} {texts [[{value The } {type text}] [{value Snow} {type hit}] [{value White Murder Case} {type text}]]}]]}]
    [{title Dead Snow 2: Red vs. Dead} {year 2014} {score 5.065053939819336} {highlights [[{score 1.3924485445022583} {path title} {texts [[{value Dead } {type text}] [{value Snow} {type hit}] [{value 2: Red vs. } {type text}]]}]]}]
    [{year 2013} {title The Secret Life of Walter Mitty} {score 1} {highlights []}]
    [{title Jurassic World} {year 2015} {score 1} {highlights []}]
    [{title Action Jackson} {year 2014} {score 1} {highlights []}]
    [{year 2013} {title In Secret} {score 1} {highlights []}]
    [{title The Stanford Prison Experiment} {year 2015} {score 1} {highlights []}]
    [{year 2014} {title The Giver} {score 1} {highlights []}]

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción boost.

    go run compound-boost-query.go
    [
    {
    genres: [ 'Comedy', 'Horror' ],
    title: 'Dead Snow',
    year: 2009,
    score: 21.872983932495117
    },
    {
    year: 2000,
    genres: [ 'Adventure', 'Comedy', 'Family' ],
    title: 'Snow Day',
    score: 21.043487548828125
    },
    {
    genres: [ 'Adventure', 'Comedy', 'Family' ],
    title: 'Snow Dogs',
    year: 2002,
    score: 21.043487548828125
    },
    {
    year: 1999,
    genres: [ 'Comedy', 'Romance' ],
    title: 'Let It Snow',
    score: 19.523927688598633
    },
    {
    genres: [ 'Action', 'Comedy', 'Horror' ],
    title: 'Dead Snow 2: Red vs. Dead',
    year: 2014,
    score: 17.426334381103516
    },
    {
    genres: [ 'Comedy', 'Drama' ],
    title: 'Snow White and Russian Red',
    year: 2009,
    score: 16.367326736450195
    },
    {
    genres: [ 'Comedy', 'Drama', 'Romance' ],
    title: 'The Tiger and the Snow',
    year: 2005,
    score: 15.537829399108887
    },
    {
    genres: [ 'Adventure', 'Comedy', 'Family' ],
    title: 'Snow White and the Three Stooges',
    year: 1961,
    score: 14.4263334274292
    }
    ]
3
  1. Crea un archivo llamado compound-boost-query.go.

  2. Copia y pega el ejemplo de código en el archivo compound-function-query.go.

    El ejemplo de código realiza las siguientes tareas:

    • Importa los paquetes y dependencias de mongodb.

    • Establece una conexión a tu clúster.

    • Usa las siguientes cláusulas del operador compound:

      • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción function. La opción function añade lo siguiente mediante una expresión aritmética:

        • La puntuación de relevancia de la query para el término de búsqueda

        • El valor del campo numérico denominado imdb.rating o el número 2 para aquellos documentos que no tienen el campo imdb.rating.

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Utiliza las siguientes etapas de pipeline:

      • Etapa $limit para limitar la salida a 10 resultados

      • $project etapa para:

        • Excluir todos los campos salvo title y year

        • Agrega dos campos denominados score y highlights

    • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

    1package main
    2
    3import (
    4 "context"
    5 "fmt"
    6 "time"
    7
    8 "go.mongodb.org/mongo-driver/v2/bson"
    9 "go.mongodb.org/mongo-driver/v2/mongo"
    10 "go.mongodb.org/mongo-driver/v2/mongo/options"
    11)
    12
    13func main() {
    14 // connect to the Atlas cluster and set a maximum operation time
    15 opts := options.Client().
    16 SetTimeout(5 * time.Second).
    17 ApplyURI("<connection-string>")
    18
    19 client, err := mongo.Connect(opts)
    20 if err != nil {
    21 panic(err)
    22 }
    23 defer client.Disconnect(context.TODO())
    24
    25 // set namespace
    26 collection := client.Database("sample_mflix").Collection("movies")
    27
    28 // define pipeline
    29 searchStage := bson.D{{"$search", bson.M{
    30 "index": "default",
    31 "compound": bson.M{
    32 "must": bson.M{
    33 "range": bson.M{
    34 "path": "year", "gte": 2013, "lte": 2015,
    35 },
    36 },
    37 "should": bson.D{
    38 {"text", bson.M{
    39 "path": "title", "query": "snow", "score": bson.M{
    40 "function": bson.D{{"add", bson.A{
    41 bson.D{{"path", bson.D{
    42 {"value", "imdb.rating"}, {"undefined", 2},
    43 }}},
    44 bson.D{{"score", "relevance"}},
    45 }}},
    46 }}}},
    47 },
    48 "highlight": bson.D{{"path", "title"}},
    49 }}}
    50 limitStage := bson.D{{"$limit", 10}}
    51 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"year", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}, {"highlights", bson.D{{"$meta", "searchHighlights"}}}}}}
    52
    53 // run pipeline
    54 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage})
    55 if err != nil {
    56 panic(err)
    57 }
    58
    59 // print results
    60 var results []bson.D
    61 if err = cursor.All(context.TODO(), &results); err != nil {
    62 panic(err)
    63 }
    64 for _, result := range results {
    65 fmt.Println(result)
    66 }
    67}
  3. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  4. Ejecute el siguiente comando para consultar su colección:

    go run compound-function-query.go
    [{title The Snow White Murder Case} {year 2014} {score 10.454826354980469} {highlights [[{score 1.3525336980819702} {path title} {texts [[{value The } {type text}] [{value Snow} {type hit}] [{value White Murder Case} {type text}]]}]]}]
    [{title Snow on the Blades} {year 2014} {score 10.3317232131958} {highlights [[{score 1.3766303062438965} {path title} {texts [[{value Snow} {type hit}] [{value on the Blades} {type text}]]}]]}]
    [{title Dead Snow 2: Red vs. Dead} {year 2014} {score 10.032526969909668} {highlights [[{score 1.3924485445022583} {path title} {texts [[{value Dead } {type text}] [{value Snow} {type hit}] [{value 2: Red vs. } {type text}]]}]]}]
    [{title Snow in Paradise} {year 2014} {score 8.386146545410156} {highlights [[{score 1.382846713066101} {path title} {texts [[{value Snow} {type hit}] [{value in Paradise} {type text}]]}]]}]
    [{year 2013} {title The Secret Life of Walter Mitty} {score 1} {highlights []}]
    [{title Jurassic World} {year 2015} {score 1} {highlights []}]
    [{title Action Jackson} {year 2014} {score 1} {highlights []}]
    [{year 2013} {title In Secret} {score 1} {highlights []}]
    [{title The Stanford Prison Experiment} {year 2015} {score 1} {highlights []}]
    [{year 2014} {title The Giver} {score 1} {highlights []}]

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción function.

1

junit

4.11 o una versión superior

mongodb-driver-sync

4.3.0 o una versión superior

slf4j-log4j12

1.7.30 o una versión superior

2
  1. Crea un archivo llamado CompoundConstantQuery.java.

  2. Copia y pega el siguiente código dentro del archivo.

    El ejemplo de código realiza las siguientes tareas:

    • Importa los paquetes y dependencias de mongodb.

    • Establece una conexión a tu clúster.

    • Utiliza las siguientes cláusulas compuestas para consultar la colección:

      • filter cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el texto operador para consultar el término snow en el campo title y alterar el score con la opción constant. La opción constant reemplaza todos los resultados de puntuación para el término de búsqueda con 5.

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Utiliza las siguientes etapas de pipeline:

      • Etapa $limit para limitar la salida a 10 resultados

      • $project etapa para:

        • Excluir todos los campos salvo title y year

        • Agrega dos campos denominados score y highlights

    • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

    1import java.util.Arrays;
    2import java.util.List;
    3
    4import static com.mongodb.client.model.Aggregates.limit;
    5import static com.mongodb.client.model.Aggregates.project;
    6import static com.mongodb.client.model.Projections.*;
    7import com.mongodb.client.MongoClient;
    8import com.mongodb.client.MongoClients;
    9import com.mongodb.client.MongoCollection;
    10import com.mongodb.client.MongoDatabase;
    11
    12import org.bson.Document;
    13
    14public class CompoundConstantQuery {
    15 public static void main( String[] args ) {
    16 // define clauses
    17 List<Document> mustClauses =
    18 List.of(
    19 new Document(
    20 "range", new Document("path", "year")
    21 .append("gte", 2013)
    22 .append("lte", 2015)));
    23 List<Document> shouldClauses =
    24 List.of(
    25 new Document("text",
    26 new Document("query", "snow")
    27 .append("path", "title")
    28 .append("score", new Document("constant", new Document("value", 5)))));
    29 Document highlightOption = new Document("path", "title");
    30 // define query
    31 Document agg =
    32 new Document("$search",
    33 new Document("index", "default")
    34 .append("compound",
    35 new Document("must", mustClauses).append("should", shouldClauses))
    36 .append("highlight", highlightOption));
    37 // specify connection
    38 String uri = "<connection-string>";
    39 // establish connection and set namespace
    40 try (MongoClient mongoClient = MongoClients.create(uri)) {
    41 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
    42 MongoCollection<Document> collection = database.getCollection("movies");
    43 // run query and print results
    44 collection.aggregate(Arrays.asList(agg,
    45 limit(10),
    46 project(fields(
    47 excludeId(),
    48 include("title", "year"),
    49 computed("score", new Document("$meta", "searchScore")),
    50 computed("highlights", new Document("$meta", "searchHighlights"))))))
    51 .forEach(doc -> System.out.println(doc.toJson()));
    52 }
    53 }
    54}

    Nota

    Para ejecutar el código de muestra en el entorno de Maven, se debe añadir lo siguiente antes de las instrucciones de importación en el archivo.

    package com.mongodb.drivers;
  3. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  4. Compila y ejecuta el archivo CompoundConstantQuery.java.

    javac CompoundConstantQuery.java
    java CompoundConstantQuery
    {"title": "Snow in Paradise", "year": 2014, "score": 5.0, "highlights": [{"score": 1.382846713066101, "path": "title", "texts": [{"value": "Snow", "type": "hit"}, {"value": " in Paradise", "type": "text"}]}]}
    {"title": "Dead Snow 2: Red vs. Dead", "year": 2014, "score": 5.0, "highlights": [{"score": 1.3924485445022583, "path": "title", "texts": [{"value": "Dead ", "type": "text"}, {"value": "Snow", "type": "hit"}, {"value": " 2: Red vs. ", "type": "text"}]}]}
    {"title": "The Snow White Murder Case", "year": 2014, "score": 5.0, "highlights": [{"score": 1.3525336980819702, "path": "title", "texts": [{"value": "The ", "type": "text"}, {"value": "Snow", "type": "hit"}, {"value": " White Murder Case", "type": "text"}]}]}
    {"title": "Snow on the Blades", "year": 2014, "score": 5.0, "highlights": [{"score": 1.3766303062438965, "path": "title", "texts": [{"value": "Snow", "type": "hit"}, {"value": " on the Blades", "type": "text"}]}]}
    {"year": 2013, "title": "The Secret Life of Walter Mitty", "score": 0.0, "highlights": []}
    {"title": "Jurassic World", "year": 2015, "score": 0.0, "highlights": []}
    {"title": "Action Jackson", "year": 2014, "score": 0.0, "highlights": []}
    {"year": 2013, "title": "In Secret", "score": 0.0, "highlights": []}
    {"title": "The Stanford Prison Experiment", "year": 2015, "score": 0.0, "highlights": []}
    {"year": 2014, "title": "The Giver", "score": 0.0, "highlights": []}

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción constant.

3
  1. Crea un archivo llamado CompoundBoostQuery.java.

  2. Copia y pega el siguiente código dentro del archivo.

    El ejemplo de código realiza las siguientes tareas:

    • Importa los paquetes y dependencias de mongodb.

    • Establece una conexión a tu clúster.

    • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

    La consulta utiliza las siguientes etapas del pipeline:

    • $search etapa para hacer queries a la colección. La query:

      • Usa las siguientes cláusulas del operador compound:

        • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

        • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción boost. La opción boost multiplica la puntuación base en los resultados para el término de búsqueda por 2.

      Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Etapa $limit para limitar la salida a 10 resultados

    • $project etapa para:

      • Excluir todos los campos salvo title y year

      • Agrega dos campos denominados score y highlights

    1import java.util.Arrays;
    2import java.util.List;
    3
    4import static com.mongodb.client.model.Aggregates.limit;
    5import static com.mongodb.client.model.Aggregates.project;
    6import static com.mongodb.client.model.Projections.*;
    7import com.mongodb.client.MongoClient;
    8import com.mongodb.client.MongoClients;
    9import com.mongodb.client.MongoCollection;
    10import com.mongodb.client.MongoDatabase;
    11import org.bson.Document;
    12
    13public class CompoundBoostQuery {
    14 public static void main( String[] args ) {
    15 // define clauses
    16 List<Document> mustClauses =
    17 List.of(
    18 new Document(
    19 "range", new Document("path", "year")
    20 .append("gte", 2013)
    21 .append("lte", 2015)));
    22 List<Document> shouldClauses =
    23 List.of(
    24 new Document(
    25 "text",
    26 new Document("query", "snow")
    27 .append("path", "title")
    28 .append("score", new Document("boost", new Document("value", 2)))));
    29 Document highlightOption = new Document("path", "title");
    30 // define query
    31 Document agg =
    32 new Document("$search",
    33 new Document("index", "default")
    34 .append("compound",
    35 new Document("must", mustClauses).append("should", shouldClauses))
    36 .append("highlight", highlightOption));
    37 // specify connection
    38 String uri = "<connection-string>";
    39 // establish connection and set namespace
    40 try (MongoClient mongoClient = MongoClients.create(uri)) {
    41 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
    42 MongoCollection<Document> collection = database.getCollection("movies");
    43 // run query and print results
    44 collection.aggregate(Arrays.asList(agg,
    45 limit(10),
    46 project(fields(
    47 excludeId(),
    48 include("title", "year"),
    49 computed("score", new Document("$meta", "searchScore")),
    50 computed("highlights", new Document("$meta", "searchHighlights"))))))
    51 .forEach(doc -> System.out.println(doc.toJson()));
    52 }
    53 }
    54}

    Esta query utiliza las siguientes cláusulas del operador compound con la opción boost para priorizar algunos campos más que otros campos:

    • must cláusula con el operador text para dar máxima prioridad al género comedy, seguido del término snow en el campo title. La opción boost aplica ponderaciones a los campos.

    • should cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

    Nota

    La opción boost aplica diferentes pesos a los campos para priorizarlos.

    1import java.util.Arrays;
    2import static com.mongodb.client.model.Filters.eq;
    3import static com.mongodb.client.model.Aggregates.limit;
    4import static com.mongodb.client.model.Aggregates.project;
    5import static com.mongodb.client.model.Projections.computed;
    6import static com.mongodb.client.model.Projections.excludeId;
    7import static com.mongodb.client.model.Projections.fields;
    8import static com.mongodb.client.model.Projections.include;
    9import com.mongodb.client.MongoClient;
    10import com.mongodb.client.MongoClients;
    11import com.mongodb.client.MongoCollection;
    12import com.mongodb.client.MongoDatabase;
    13import org.bson.Document;
    14
    15public class CompoundBoostQuery {
    16 public static void main( String[] args ) {
    17 Document agg = new Document("index", "default")
    18 .append("must", Arrays.asList(new Document("text",
    19 new Document("path", "genres")
    20 .append("query", "comedy")
    21 .append("score",
    22 new Document("boost",
    23 new Document("value", 9)))),
    24 new Document("text",
    25 new Document("path", "title")
    26 .append("query", "snow")
    27 .append("score",
    28 new Document("boost",
    29 new Document("value", 5))))))
    30 .append("should", Arrays.asList(new Document("range",
    31 new Document("path", "year")
    32 .append("gte", 2013)
    33 .append("lte", 2015)
    34 .append("score",
    35 new Document("boost",
    36 new Document("value", 3))))));
    37
    38 String uri = "<connection-string>";
    39
    40 try (MongoClient mongoClient = MongoClients.create(uri)) {
    41 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
    42 MongoCollection<Document> collection = database.getCollection("movies");
    43
    44 collection.aggregate(Arrays.asList(
    45 eq("$search", eq("compound", agg)),
    46 limit(10),
    47 project(fields(excludeId(), include("title", "year","genres"), computed("score", new Document("$meta", "searchScore")))))
    48 ).forEach(doc -> System.out.println(doc.toJson()));
    49 }
    50 }
    51}

    Nota

    Para ejecutar el código de muestra en el entorno de Maven, se debe añadir lo siguiente antes de las instrucciones de importación en el archivo.

    package com.mongodb.drivers;
  3. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  4. Compila y ejecuta el archivo CompoundBoostQuery.java.

    javac CompoundBoostQuery.java
    java CompoundBoostQuery
    {"title": "Snow in Paradise", "year": 2014, "score": 6.7722930908203125, "highlights": [{"score": 1.382846713066101, "path": "title", "texts": [{"value": "Snow", "type": "hit"}, {"value": " in Paradise", "type": "text"}]}]}
    {"title": "Snow on the Blades", "year": 2014, "score": 6.063445568084717, "highlights": [{"score": 1.3766303062438965, "path": "title", "texts": [{"value": "Snow", "type": "hit"}, {"value": " on the Blades", "type": "text"}]}]}
    {"title": "The Snow White Murder Case", "year": 2014, "score": 5.509652137756348, "highlights": [{"score": 1.3525336980819702, "path": "title", "texts": [{"value": "The ", "type": "text"}, {"value": "Snow", "type": "hit"}, {"value": " White Murder Case", "type": "text"}]}]}
    {"title": "Dead Snow 2: Red vs. Dead", "year": 2014, "score": 5.065053939819336, "highlights": [{"score": 1.3924485445022583, "path": "title", "texts": [{"value": "Dead ", "type": "text"}, {"value": "Snow", "type": "hit"}, {"value": " 2: Red vs. ", "type": "text"}]}]}
    {"year": 2013, "title": "The Secret Life of Walter Mitty", "score": 1.0, "highlights": []}
    {"title": "Jurassic World", "year": 2015, "score": 1.0, "highlights": []}
    {"title": "Action Jackson", "year": 2014, "score": 1.0, "highlights": []}
    {"year": 2013, "title": "In Secret", "score": 1.0, "highlights": []}
    {"title": "The Stanford Prison Experiment", "year": 2015, "score": 1.0, "highlights": []}
    {"year": 2014, "title": "The Giver", "score": 1.0, "highlights": []}

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción boost.

    javac CompoundBoostQuery.java
    java CompoundBoostQuery
    {
    "genres": ["Comedy", "Horror"],
    "title": "Dead Snow",
    "year": 2009,
    "score": 21.872983932495117
    }
    {
    "year": 2000,
    "genres": ["Adventure", "Comedy", "Family"],
    "title": "Snow Day",
    "score": 21.043487548828125
    }
    {
    "genres": ["Adventure", "Comedy", "Family"],
    "title": "Snow Dogs",
    "year": 2002,
    "score": 21.043487548828125
    }
    {
    "year": 1999,
    "genres": ["Comedy", "Romance"],
    "title": "Let It Snow",
    "score": 19.523927688598633
    }
    {
    "genres": ["Action", "Comedy", "Horror"],
    "title": "Dead Snow 2: Red vs. Dead",
    "year": 2014,
    "score": 17.426334381103516
    }
    {
    "genres": ["Comedy", "Drama"],
    "title": "Snow White and Russian Red",
    "year": 2009,
    "score": 16.367326736450195}
    {
    "genres": ["Comedy", "Drama", "Romance"],
    "title": "The Tiger and the Snow",
    "year": 2005,
    "score": 15.537829399108887
    }
    {
    "genres": ["Adventure", "Comedy", "Family"],
    "title": "Snow White and the Three Stooges",
    "year": 1961,
    "score": 14.4263334274292
    }
4
  1. Crea un archivo llamado CompoundFunctionQuery.java.

  2. Copia y pega el siguiente código dentro del archivo.

    El ejemplo de código realiza las siguientes tareas:

    • Importa los paquetes y dependencias de mongodb.

    • Establece una conexión a tu clúster.

    • Utiliza las siguientes etapas de la pipeline para query la colección:

      • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción function. La opción function añade lo siguiente mediante una expresión aritmética:

        • La puntuación de relevancia de la query para el término de búsqueda

        • El valor del campo numérico denominado imdb.rating o el número 2 para aquellos documentos que no tienen el campo imdb.rating.

    • Utiliza las siguientes etapas de pipeline:

      • Etapa $limit para limitar la salida a 10 resultados

      • $project etapa para:

        • Excluir todos los campos salvo title y year

        • Agrega dos campos denominados score y highlights

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

    1import java.util.Arrays;
    2import java.util.List;
    3
    4import static com.mongodb.client.model.Aggregates.limit;
    5import static com.mongodb.client.model.Aggregates.project;
    6import static com.mongodb.client.model.Projections.*;
    7import com.mongodb.client.MongoClient;
    8import com.mongodb.client.MongoClients;
    9import com.mongodb.client.MongoCollection;
    10import com.mongodb.client.MongoDatabase;
    11import org.bson.Document;
    12
    13public class CompoundFunctionQuery {
    14 public static void main( String[] args ) {
    15 // define clauses
    16 List<Document> mustClauses =
    17 List.of(
    18 new Document("range", new Document("path", "year")
    19 .append("gte", 2013)
    20 .append("lte", 2015)));
    21 List<Document> shouldClauses =
    22 List.of(
    23 new Document("text",
    24 new Document("query", "snow")
    25 .append("path", "title")
    26 .append("score", new Document("function",
    27 new Document("add", Arrays.asList(
    28 new Document("path", new Document("value", "imdb.rating")
    29 .append("undefined", 2)), new Document("score", "relevance")))))));
    30 Document highlightOption = new Document("path", "title");
    31 // define query
    32 Document agg =
    33 new Document("$search",
    34 new Document("index", "default")
    35 .append("compound",
    36 new Document("must", mustClauses).append("should", shouldClauses))
    37 .append("highlight", highlightOption));
    38 // specify connection
    39 String uri = "<connection-string>";
    40 // establish connection and set namespace
    41 try (MongoClient mongoClient = MongoClients.create(uri)) {
    42 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
    43 MongoCollection<Document> collection = database.getCollection("movies");
    44 // run query and print results
    45 collection.aggregate(Arrays.asList(agg,
    46 limit(10),
    47 project(fields(
    48 excludeId(),
    49 include("title", "year"),
    50 computed("score", new Document("$meta", "searchScore")),
    51 computed("highlights", new Document("$meta", "searchHighlights"))))))
    52 .forEach(doc -> System.out.println(doc.toJson()));
    53 }
    54 }
    55}

    Nota

    Para ejecutar el código de muestra en el entorno de Maven, se debe añadir lo siguiente antes de las instrucciones de importación en el archivo.

    package com.mongodb.drivers;
  3. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  4. Compila y ejecuta el archivo CompoundFunctionQuery.java.

    javac CompoundFunctionQuery.java
    java CompoundFunctionQuery
    {"title": "The Snow White Murder Case", "year": 2014, "score": 10.454826354980469, "highlights": [{"score": 1.3525336980819702, "path": "title", "texts": [{"value": "The ", "type": "text"}, {"value": "Snow", "type": "hit"}, {"value": " White Murder Case", "type": "text"}]}]}
    {"title": "Snow on the Blades", "year": 2014, "score": 10.3317232131958, "highlights": [{"score": 1.3766303062438965, "path": "title", "texts": [{"value": "Snow", "type": "hit"}, {"value": " on the Blades", "type": "text"}]}]}
    {"title": "Dead Snow 2: Red vs. Dead", "year": 2014, "score": 10.032526969909668, "highlights": [{"score": 1.3924485445022583, "path": "title", "texts": [{"value": "Dead ", "type": "text"}, {"value": "Snow", "type": "hit"}, {"value": " 2: Red vs. ", "type": "text"}]}]}
    {"title": "Snow in Paradise", "year": 2014, "score": 8.386146545410156, "highlights": [{"score": 1.382846713066101, "path": "title", "texts": [{"value": "Snow", "type": "hit"}, {"value": " in Paradise", "type": "text"}]}]}
    {"year": 2013, "title": "The Secret Life of Walter Mitty", "score": 1.0, "highlights": []}
    {"title": "Jurassic World", "year": 2015, "score": 1.0, "highlights": []}
    {"title": "Action Jackson", "year": 2014, "score": 1.0, "highlights": []}
    {"year": 2013, "title": "In Secret", "score": 1.0, "highlights": []}
    {"title": "The Stanford Prison Experiment", "year": 2015, "score": 1.0, "highlights": []}
    {"year": 2014, "title": "The Giver", "score": 1.0, "highlights": []}

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción function.

1

mongodb-driver-kotlin-coroutine

4.10.0 o una versión superior

2
  1. Crea un archivo llamado CompoundConstantQuery.kt.

  2. Copia y pega el siguiente código dentro del archivo.

    El ejemplo de código realiza las siguientes tareas:

    • Importa los paquetes y dependencias de mongodb.

    • Establece una conexión a tu clúster.

    • Utiliza las siguientes cláusulas compuestas para consultar la colección:

      • filter cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el texto operador para consultar el término snow en el campo title y alterar el score con la opción constant. La opción constant reemplaza todos los resultados de puntuación para el término de búsqueda con 5.

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Utiliza las siguientes etapas de pipeline:

      • Etapa $limit para limitar la salida a 10 resultados

      • $project etapa para:

        • Excluir todos los campos salvo title y year

        • Agrega dos campos denominados score y highlights

    • Imprime los documentos que coinciden con la query de la instancia AggregateFlow.

    1import com.mongodb.client.model.Aggregates.limit
    2import com.mongodb.client.model.Aggregates.project
    3import com.mongodb.client.model.Projections.*
    4import com.mongodb.kotlin.client.coroutine.MongoClient
    5import kotlinx.coroutines.runBlocking
    6import org.bson.Document
    7
    8fun main() {
    9 // establish connection and set namespace
    10 val uri = "<connection-string>"
    11 val mongoClient = MongoClient.create(uri)
    12 val database = mongoClient.getDatabase("sample_mflix")
    13 val collection = database.getCollection<Document>("movies")
    14
    15 runBlocking {
    16 // define clauses
    17 val mustClauses = listOf(
    18 Document(
    19 "range", Document("path", "year")
    20 .append("gte", 2013)
    21 .append("lte", 2015)
    22 )
    23 )
    24
    25 val shouldClauses = listOf(
    26 Document(
    27 "text",
    28 Document("query", "snow")
    29 .append("path", "title")
    30 .append("score", Document("constant", Document("value", 5)))
    31 )
    32 )
    33
    34 val highlightOption = Document("path", "title")
    35
    36 // define pipeline
    37 val agg = Document(
    38 "\$search",
    39 Document("index", "default")
    40 .append(
    41 "compound",
    42 Document("must", mustClauses).append("should", shouldClauses)
    43 )
    44 .append("highlight", highlightOption)
    45 )
    46
    47 val resultsFlow = collection.aggregate<Document>(
    48 listOf(
    49 agg,
    50 limit(10),
    51 project(fields(
    52 excludeId(),
    53 include("title", "year"),
    54 computed("score", Document("\$meta", "searchScore")),
    55 computed("highlights", Document("\$meta", "searchHighlights"))
    56 ))
    57 )
    58 )
    59 resultsFlow.collect { println(it) }
    60 }
    61 mongoClient.close()
    62}
  3. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  4. Ejecuta el argumento de entrada CompoundConstantQuery.kt Archivo.

    Cuando se ejecuta el programa CompoundConstantQuery.kt en el IDE, este imprime los siguientes documentos:

    Document{{title=Snow in Paradise, year=2014, score=6.0, highlights=[Document{{score=1.382846713066101, path=title, texts=[Document{{value=Snow, type=hit}}, Document{{value= in Paradise, type=text}}]}}]}}
    Document{{title=Dead Snow 2: Red vs. Dead, year=2014, score=6.0, highlights=[Document{{score=1.3924485445022583, path=title, texts=[Document{{value=Dead , type=text}}, Document{{value=Snow, type=hit}}, Document{{value= 2: Red vs. , type=text}}]}}]}}
    Document{{title=The Snow White Murder Case, year=2014, score=6.0, highlights=[Document{{score=1.3525336980819702, path=title, texts=[Document{{value=The , type=text}}, Document{{value=Snow, type=hit}}, Document{{value= White Murder Case, type=text}}]}}]}}
    Document{{title=Snow on the Blades, year=2014, score=6.0, highlights=[Document{{score=1.3766303062438965, path=title, texts=[Document{{value=Snow, type=hit}}, Document{{value= on the Blades, type=text}}]}}]}}
    Document{{year=2013, title=The Secret Life of Walter Mitty, score=1.0, highlights=[]}}
    Document{{title=Jurassic World, year=2015, score=1.0, highlights=[]}}
    Document{{title=Action Jackson, year=2014, score=1.0, highlights=[]}}
    Document{{year=2013, title=In Secret, score=1.0, highlights=[]}}
    Document{{title=The Stanford Prison Experiment, year=2015, score=1.0, highlights=[]}}
    Document{{year=2014, title=The Giver, score=1.0, highlights=[]}}

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción constant.

3
  1. Crea un archivo llamado CompoundBoostQuery.kt.

  2. Copia y pega el siguiente código dentro del archivo.

    El ejemplo de código realiza las siguientes tareas:

    • Importa los paquetes y dependencias de mongodb.

    • Establece una conexión a tu clúster.

    • Imprime los documentos que coinciden con la query de la instancia AggregateFlow.

    La consulta utiliza las siguientes etapas del pipeline:

    • $search etapa para hacer queries a la colección. La query:

      • Usa las siguientes cláusulas del operador compound:

        • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

        • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción boost. La opción boost multiplica la puntuación base en los resultados para el término de búsqueda por 2.

      Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Etapa $limit para limitar la salida a 10 resultados

    • $project etapa para:

      • Excluir todos los campos salvo title y year

      • Agrega dos campos denominados score y highlights

    1import com.mongodb.client.model.Aggregates.limit
    2import com.mongodb.client.model.Aggregates.project
    3import com.mongodb.client.model.Projections.*
    4import com.mongodb.kotlin.client.coroutine.MongoClient
    5import kotlinx.coroutines.runBlocking
    6import org.bson.Document
    7
    8fun main() {
    9 // establish connection and set namespace
    10 val uri = "<connection-string>"
    11 val mongoClient = MongoClient.create(uri)
    12
    13 val database = mongoClient.getDatabase("sample_mflix")
    14 val collection = database.getCollection<Document>("movies")
    15
    16 runBlocking {
    17 // define clauses
    18 val mustClauses = listOf(
    19 Document(
    20 "range", Document("path", "year")
    21 .append("gte", 2013)
    22 .append("lte", 2015)
    23 )
    24 )
    25
    26 val shouldClauses = listOf(
    27 Document(
    28 "text",
    29 Document("query", "snow")
    30 .append("path", "title")
    31 .append("score", Document("boost", Document("value", 2)))
    32 )
    33 )
    34
    35 val highlightOption = Document("path", "title")
    36
    37 // define pipeline
    38 val agg = Document(
    39 "\$search",
    40 Document("index", "default")
    41 .append(
    42 "compound",
    43 Document("must", mustClauses).append("should", shouldClauses)
    44 )
    45 .append("highlight", highlightOption)
    46 )
    47
    48 // run query and print results
    49 val resultsFlow = collection.aggregate<Document>(
    50 listOf(
    51 agg,
    52 limit(10),
    53 project(fields(
    54 excludeId(),
    55 include("title", "year"),
    56 computed("score", Document("\$meta", "searchScore")),
    57 computed("highlights", Document("\$meta", "searchHighlights"))
    58 ))
    59 )
    60 )
    61 resultsFlow.collect { println(it) }
    62 }
    63 mongoClient.close()
    64}

    Esta query utiliza las siguientes cláusulas del operador compound con la opción boost para priorizar algunos campos más que otros campos:

    • must cláusula con el operador text para dar máxima prioridad al género comedy, seguido del término snow en el campo title. La opción boost aplica ponderaciones a los campos.

    • should cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

    Nota

    La opción boost aplica diferentes pesos a los campos para priorizarlos.

    1import com.mongodb.client.model.Aggregates.limit
    2import com.mongodb.client.model.Aggregates.project
    3import com.mongodb.client.model.Projections.*
    4import com.mongodb.kotlin.client.coroutine.MongoClient
    5import kotlinx.coroutines.runBlocking
    6import org.bson.Document
    7
    8fun main() {
    9 // establish connection and set namespace
    10 val uri = "<connection-string>"
    11 val mongoClient = MongoClient.create(uri)
    12
    13 val database = mongoClient.getDatabase("sample_mflix")
    14 val collection = database.getCollection<Document>("movies")
    15
    16 runBlocking {
    17 // define pipeline
    18 val agg = Document(
    19 "\$search",
    20 Document("index", "default")
    21 .append(
    22 "compound",
    23 Document(
    24 "must", listOf(
    25 Document(
    26 "text",
    27 Document("path", "genres")
    28 .append("query", "comedy")
    29 .append(
    30 "score",
    31 Document(
    32 "boost",
    33 Document("value", 9)
    34 )
    35 )
    36 ),
    37 Document(
    38 "text",
    39 Document("path", "title")
    40 .append("query", "snow")
    41 .append(
    42 "score",
    43 Document(
    44 "boost",
    45 Document("value", 5)
    46 )
    47 )
    48 )
    49 )
    50 )
    51 .append(
    52 "should", listOf(
    53 Document(
    54 "range",
    55 Document("path", "year")
    56 .append("gte", 2013)
    57 .append("lte", 2015)
    58 .append(
    59 "score",
    60 Document(
    61 "boost",
    62 Document("value", 3)
    63 )
    64 )
    65 )
    66 )
    67 )
    68 )
    69 )
    70
    71 // run query and print results
    72 val resultsFlow = collection.aggregate<Document>(
    73 listOf(
    74 agg,
    75 limit(10),
    76 project(fields(
    77 excludeId(),
    78 include("title", "year","genres"),
    79 computed("score", Document("\$meta", "searchScore"))
    80 ))
    81 )
    82 )
    83 resultsFlow.collect { println(it) }
    84 }
    85 mongoClient.close()
    86}
  3. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  4. Ejecuta el argumento de entrada CompoundBoostQuery.kt Archivo.

    Cuando se ejecuta el programa CompoundBoostQuery.kt en el IDE, este imprime los siguientes documentos:

    Document{{title=Snow in Paradise, year=2014, score=6.784297466278076, highlights=[Document{{score=1.382846713066101, path=title, texts=[Document{{value=Snow, type=hit}}, Document{{value= in Paradise, type=text}}]}}]}}
    Document{{title=Snow on the Blades, year=2014, score=6.073266506195068, highlights=[Document{{score=1.3766303062438965, path=title, texts=[Document{{value=Snow, type=hit}}, Document{{value= on the Blades, type=text}}]}}]}}
    Document{{title=The Snow White Murder Case, year=2014, score=5.517906188964844, highlights=[Document{{score=1.3525336980819702, path=title, texts=[Document{{value=The , type=text}}, Document{{value=Snow, type=hit}}, Document{{value= White Murder Case, type=text}}]}}]}}
    Document{{title=Dead Snow 2: Red vs. Dead, year=2014, score=5.072136878967285, highlights=[Document{{score=1.3924485445022583, path=title, texts=[Document{{value=Dead , type=text}}, Document{{value=Snow, type=hit}}, Document{{value= 2: Red vs. , type=text}}]}}]}}
    Document{{year=2013, title=The Secret Life of Walter Mitty, score=1.0, highlights=[]}}
    Document{{title=Jurassic World, year=2015, score=1.0, highlights=[]}}
    Document{{title=Action Jackson, year=2014, score=1.0, highlights=[]}}
    Document{{year=2013, title=In Secret, score=1.0, highlights=[]}}
    Document{{title=The Stanford Prison Experiment, year=2015, score=1.0, highlights=[]}}
    Document{{year=2014, title=The Giver, score=1.0, highlights=[]}}

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción boost.

    Cuando se ejecuta el programa CompoundBoostQuery.kt en el IDE, este imprime los siguientes documentos:

    Document{{year=2000, genres=[Adventure, Comedy, Family], title=Snow Day, score=20.998544692993164}}
    Document{{genres=[Adventure, Comedy, Family], title=Snow Dogs, year=2002, score=20.998544692993164}}
    Document{{year=1999, genres=[Comedy, Romance], title=Let It Snow, score=19.45327377319336}}
    Document{{genres=[Action, Comedy, Horror], title=Dead Snow 2: Red vs. Dead, year=2014, score=17.361087799072266}}
    Document{{genres=[Comedy, Drama], title=Snow White and Russian Red, year=2009, score=16.287294387817383}}
    Document{{genres=[Comedy, Drama, Romance], title=The Tiger and the Snow, year=2005, score=15.475509643554688}}
    Document{{genres=[Adventure, Comedy, Family], title=Snow White and the Three Stooges, year=1961, score=14.361087799072266}}
4
  1. Crea un archivo llamado CompoundFunctionQuery.kt.

  2. Copia y pega el siguiente código dentro del archivo.

    El ejemplo de código realiza las siguientes tareas:

    • Importa los paquetes y dependencias de mongodb.

    • Establece una conexión a tu clúster.

    • Utiliza las siguientes etapas de la pipeline para query la colección:

      • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción function. La opción function añade lo siguiente mediante una expresión aritmética:

        • La puntuación de relevancia de la query para el término de búsqueda

        • El valor del campo numérico denominado imdb.rating o el número 2 para aquellos documentos que no tienen el campo imdb.rating.

    • Utiliza las siguientes etapas de pipeline:

      • Etapa $limit para limitar la salida a 10 resultados

      • $project etapa para:

        • Excluir todos los campos salvo title y year

        • Agrega dos campos denominados score y highlights

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Imprime los documentos que coinciden con la query de la instancia AggregateFlow.

    1import com.mongodb.client.model.Aggregates.limit
    2import com.mongodb.client.model.Aggregates.project
    3import com.mongodb.client.model.Projections.*
    4import com.mongodb.kotlin.client.coroutine.MongoClient
    5import kotlinx.coroutines.runBlocking
    6import org.bson.Document
    7
    8fun main() {
    9 // establish connection and set namespace
    10 val uri = "<connection-string>"
    11 val mongoClient = MongoClient.create(uri)
    12
    13 val database = mongoClient.getDatabase("sample_mflix")
    14 val collection = database.getCollection<Document>("movies")
    15
    16 runBlocking {
    17 // define clauses
    18 val mustClauses = listOf(
    19 Document(
    20 "range", Document("path", "year")
    21 .append("gte", 2013)
    22 .append("lte", 2015)
    23 )
    24 )
    25
    26 val shouldClauses = listOf(
    27 Document("text", Document("query", "snow")
    28 .append("path", "title")
    29 .append("score",
    30 Document("function", Document("add", listOf(
    31 Document("path", Document("value", "imdb.rating").append("undefined", 2)),
    32 Document("score", "relevance")
    33 )))
    34 )
    35 )
    36 )
    37
    38 val highlightOption = Document("path", "title")
    39
    40 // define pipeline
    41 val agg = Document(
    42 "\$search",
    43 Document("index", "default")
    44 .append(
    45 "compound",
    46 Document("must", mustClauses).append("should", shouldClauses)
    47 )
    48 .append("highlight", highlightOption)
    49 )
    50
    51 // run query and print results
    52 val resultsFlow = collection.aggregate<Document>(
    53 listOf(
    54 agg,
    55 limit(10),
    56 project(fields(
    57 excludeId(),
    58 include("title", "year"),
    59 computed("score", Document("\$meta", "searchScore")),
    60 computed("highlights", Document("\$meta", "searchHighlights"))
    61 ))
    62 )
    63 )
    64 resultsFlow.collect { println(it) }
    65 }
    66 mongoClient.close()
    67}
  3. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  4. Ejecuta el argumento de entrada CompoundFunctionQuery.kt Archivo.

    Cuando se ejecuta el programa CompoundFunctionQuery.kt en el IDE, este imprime los siguientes documentos:

    Document{{title=The Snow White Murder Case, year=2014, score=10.458952903747559, highlights=[Document{{score=1.3525336980819702, path=title, texts=[Document{{value=The , type=text}}, Document{{value=Snow, type=hit}}, Document{{value= White Murder Case, type=text}}]}}]}}
    Document{{title=Snow on the Blades, year=2014, score=10.336633682250977, highlights=[Document{{score=1.3766303062438965, path=title, texts=[Document{{value=Snow, type=hit}}, Document{{value= on the Blades, type=text}}]}}]}}
    Document{{title=Dead Snow 2: Red vs. Dead, year=2014, score=10.036067962646484, highlights=[Document{{score=1.3924485445022583, path=title, texts=[Document{{value=Dead , type=text}}, Document{{value=Snow, type=hit}}, Document{{value= 2: Red vs. , type=text}}]}}]}}
    Document{{title=Snow in Paradise, year=2014, score=8.392148971557617, highlights=[Document{{score=1.382846713066101, path=title, texts=[Document{{value=Snow, type=hit}}, Document{{value= in Paradise, type=text}}]}}]}}
    Document{{year=2013, title=The Secret Life of Walter Mitty, score=1.0, highlights=[]}}
    Document{{title=Jurassic World, year=2015, score=1.0, highlights=[]}}
    Document{{title=Action Jackson, year=2014, score=1.0, highlights=[]}}
    Document{{year=2013, title=In Secret, score=1.0, highlights=[]}}
    Document{{title=The Stanford Prison Experiment, year=2015, score=1.0, highlights=[]}}
    Document{{year=2014, title=The Giver, score=1.0, highlights=[]}}

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción function.

1
  1. Crea un archivo llamado compound-constant-query.js.

  2. Copia y pega el ejemplo de código en el archivo compound-constant-query.js.

    El ejemplo de código realiza las siguientes tareas:

    • Importa mongodb, el controlador Node.js de MongoDB.

    • Crea una instancia de la clase MongoClient para establecer una conexión con el clúster.

    • Utiliza las siguientes cláusulas compuestas para consultar la colección:

      • filter cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el texto operador para consultar el término snow en el campo title y alterar el score con la opción constant. La opción constant reemplaza todos los resultados de puntuación para el término de búsqueda con 5.

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Utiliza las siguientes etapas de pipeline:

      • Etapa $limit para limitar la salida a 10 resultados

      • $project etapa para:

        • Excluir todos los campos salvo title y year

        • Agrega dos campos denominados score y highlights

    • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

    1const MongoClient = require("mongodb").MongoClient;
    2const assert = require("assert");
    3
    4const agg = [
    5 {
    6 '$search': {
    7 'index': 'default',
    8 'compound': {
    9 'filter': [
    10 {
    11 'range': {
    12 'path': 'year',
    13 'gte': 2013,
    14 'lte': 2015
    15 }
    16 }
    17 ],
    18 'should': [
    19 {
    20 'text': {
    21 'query': 'snow',
    22 'path': 'title',
    23 'score': {
    24 'constant': {
    25 'value': 5
    26 }
    27 }
    28 }
    29 }
    30 ]
    31 },
    32 'highlight': {
    33 'path': 'title'
    34 }
    35 }
    36 }, {
    37 '$limit': 10
    38 }, {
    39 '$project': {
    40 '_id': 0,
    41 'title': 1,
    42 'year': 1,
    43 'score': {
    44 '$meta': 'searchScore'
    45 },
    46 'highlights': {
    47 '$meta': 'searchHighlights'
    48 }
    49 }
    50 }
    51];
    52
    53MongoClient.connect(
    54 "<connection-string>",
    55 async function (connectErr, client) {
    56 assert.equal(null, connectErr);
    57 const coll = client.db("sample_mflix").collection("movies");
    58 let cursor = await coll.aggregate(agg);
    59 await cursor.forEach((doc) => console.log(doc));
    60 client.close();
    61 }
    62);
  3. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  4. Ejecute el siguiente comando para consultar su colección:

    node compound-constant-query.js
    '{"title":"Snow in Paradise","year":2014,"score":5,"highlights":[{"score":1.382846713066101,"path":"title","texts":[{"value":"Snow","type":"hit"},{"value":" in Paradise","type":"text"}]}]}'
    '{"title":"Dead Snow 2: Red vs. Dead","year":2014,"score":5,"highlights":[{"score":1.3924485445022583,"path":"title","texts":[{"value":"Dead ","type":"text"},{"value":"Snow","type":"hit"},{"value":" 2: Red vs. ","type":"text"}]}]}'
    '{"title":"The Snow White Murder Case","year":2014,"score":5,"highlights":[{"score":1.3525336980819702,"path":"title","texts":[{"value":"The ","type":"text"},{"value":"Snow","type":"hit"},{"value":" White Murder Case","type":"text"}]}]}'
    '{"title":"Snow on the Blades","year":2014,"score":5,"highlights":[{"score":1.3766303062438965,"path":"title","texts":[{"value":"Snow","type":"hit"},{"value":" on the Blades","type":"text"}]}]}'
    '{"year":2013,"title":"The Secret Life of Walter Mitty","score":0,"highlights":[]}'
    '{"title":"Jurassic World","year":2015,"score":0,"highlights":[]}'
    '{"title":"Action Jackson","year":2014,"score":0,"highlights":[]}'
    '{"year":2013,"title":"In Secret","score":0,"highlights":[]}'
    '{"title":"The Stanford Prison Experiment","year":2015,"score":0,"highlights":[]}'
    '{"year":2014,"title":"The Giver","score":0,"highlights":[]}'

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción constant.

2
  1. Crea un archivo llamado compound-boost-query.js.

  2. Copia y pega el ejemplo de código en el archivo compound-boost-query.js.

    El ejemplo de código realiza las siguientes tareas:

    • Importa mongodb, el controlador Node.js de MongoDB.

    • Crea una instancia de la clase MongoClient para establecer una conexión con el clúster.

    • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

    La consulta utiliza las siguientes etapas del pipeline:

    • $search etapa para hacer queries a la colección. La query:

      • Usa las siguientes cláusulas del operador compound:

        • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

        • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción boost. La opción boost multiplica la puntuación base en los resultados para el término de búsqueda por 2.

      • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Etapa $limit para limitar la salida a 10 resultados

    • $project etapa para:

      • Excluir todos los campos salvo title y year

      • Agrega dos campos denominados score y highlights

    1const MongoClient = require("mongodb").MongoClient;
    2const assert = require("assert");
    3
    4const agg = [
    5 {
    6 '$search': {
    7 'index': 'default',
    8 'compound': {
    9 'must': [
    10 {
    11 'range': {
    12 'path': 'year',
    13 'gte': 2013,
    14 'lte': 2015
    15 }
    16 }
    17 ],
    18 'should': [
    19 {
    20 'text': {
    21 'query': 'snow',
    22 'path': 'title',
    23 'score': {
    24 'boost': {
    25 'value': 2
    26 }
    27 }
    28 }
    29 }
    30 ]
    31 }
    32 }
    33 }, {
    34 '$limit': 10
    35 }, {
    36 '$project': {
    37 '_id': 0,
    38 'title': 1,
    39 'year': 1,
    40 'score': {
    41 '$meta': 'searchScore'
    42 }
    43 }
    44 }
    45];
    46
    47MongoClient.connect(
    48 "<connection-string>",
    49 async function (connectErr, client) {
    50 assert.equal(null, connectErr);
    51 const coll = client.db("sample_mflix").collection("movies");
    52 let cursor = await coll.aggregate(agg);
    53 await cursor.forEach((doc) => console.log(doc));
    54 client.close();
    55 }
    56);

    La consulta utiliza las siguientes etapas del pipeline:

    • $search etapa para hacer queries a la colección. La query:

      • Utiliza las siguientes cláusulas de operador compound con la opción boost para priorizar algunos campos más que otros:

        • must cláusula con el operador text para dar máxima prioridad al género comedy, seguido del término snow en el campo title. La opción boost aplica ponderaciones a los campos.

        • should cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

        Nota

        La opción boost aplica diferentes pesos a los campos para priorizarlos.

      • Etapa $limit para limitar la salida a 10 resultados

      • $project etapa para:

        • Excluir todos los campos salvo title y year

        • Agrega dos campos denominados score y highlights

    1const MongoClient = require("mongodb").MongoClient;
    2const assert = require("assert");
    3
    4const agg = [
    5 {
    6 '$search': {
    7 'index': 'default',
    8 'compound': {
    9 'must': [
    10 {
    11 'text': {
    12 'path': 'genres',
    13 'query': 'comedy',
    14 'score': {
    15 'boost': {
    16 'value': 9
    17 }
    18 }
    19 }
    20 }, {
    21 'text': {
    22 'path': 'title',
    23 'query': 'snow',
    24 'score': {
    25 'boost': {
    26 'value': 5
    27 }
    28 }
    29 }
    30 }
    31 ],
    32 'should': [
    33 {
    34 'range': {
    35 'path': 'year',
    36 'gte': 2013,
    37 'lte': 2015,
    38 'score': {
    39 'boost': {
    40 'value': 3
    41 }
    42 }
    43 }
    44 }
    45 ]
    46 }
    47 }
    48 }, {
    49 '$limit': 10
    50 }, {
    51 '$project': {
    52 '_id': 0,
    53 'title': 1,
    54 'year': 1,
    55 'genres': 1,
    56 'score': {
    57 '$meta': 'searchScore'
    58 }
    59 }
    60 }
    61];
    62
    63MongoClient.connect(
    64 "<connection-string>",
    65 async function (connectErr, client) {
    66 assert.equal(null, connectErr);
    67 const coll = client.db("sample_mflix").collection("movies");
    68 let cursor = await coll.aggregate(agg);
    69 await cursor.forEach((doc) => console.log(doc));
    70 client.close();
    71 }
    72);
  3. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  4. Ejecute el siguiente comando para consultar su colección:

    node compound-boost-query.js
    '{"title":"Snow in Paradise","year":2014,"score":6.7722930908203125,"highlights":[{"score":1.382846713066101,"path":"title","texts":[{"value":"Snow","type":"hit"},{"value":" in Paradise","type":"text"}]}]}'
    '{"title":"Snow on the Blades","year":2014,"score":6.063445568084717,"highlights":[{"score":1.3766303062438965,"path":"title","texts":[{"value":"Snow","type":"hit"},{"value":" on the Blades","type":"text"}]}]}'
    '{"title":"The Snow White Murder Case","year":2014,"score":5.509652137756348,"highlights":[{"score":1.3525336980819702,"path":"title","texts":[{"value":"The ","type":"text"},{"value":"Snow","type":"hit"},{"value":" White Murder Case","type":"text"}]}]}'
    '{"title":"Dead Snow 2: Red vs. Dead","year":2014,"score":5.065053939819336,"highlights":[{"score":1.3924485445022583,"path":"title","texts":[{"value":"Dead ","type":"text"},{"value":"Snow","type":"hit"},{"value":" 2: Red vs. ","type":"text"}]}]}'
    '{"year":2013,"title":"The Secret Life of Walter Mitty","score":1,"highlights":[]}'
    '{"title":"Jurassic World","year":2015,"score":1,"highlights":[]}'
    '{"title":"Action Jackson","year":2014,"score":1,"highlights":[]}'
    '{"year":2013,"title":"In Secret","score":1,"highlights":[]}'
    '{"title":"The Stanford Prison Experiment","year":2015,"score":1,"highlights":[]}'
    '{"year":2014,"title":"The Giver","score":1,"highlights":[]}'

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción boost.

    node compound-boost-query.js
    {
    genres: [ 'Comedy', 'Horror' ],
    title: 'Dead Snow',
    year: 2009,
    score: 21.872983932495117
    }
    {
    year: 2000,
    genres: [ 'Adventure', 'Comedy', 'Family' ],
    title: 'Snow Day',
    score: 21.043487548828125
    }
    {
    genres: [ 'Adventure', 'Comedy', 'Family' ],
    title: 'Snow Dogs',
    year: 2002,
    score: 21.043487548828125
    }
    {
    year: 1999,
    genres: [ 'Comedy', 'Romance' ],
    title: 'Let It Snow',
    score: 19.523927688598633
    }
    {
    genres: [ 'Action', 'Comedy', 'Horror' ],
    title: 'Dead Snow 2: Red vs. Dead',
    year: 2014,
    score: 17.426334381103516
    }
    {
    genres: [ 'Comedy', 'Drama' ],
    title: 'Snow White and Russian Red',
    year: 2009,
    score: 16.367326736450195
    }
    {
    genres: [ 'Comedy', 'Drama', 'Romance' ],
    title: 'The Tiger and the Snow',
    year: 2005,
    score: 15.537829399108887
    }
    {
    genres: [ 'Adventure', 'Comedy', 'Family' ],
    title: 'Snow White and the Three Stooges',
    year: 1961,
    score: 14.4263334274292
    }
3
  1. Crea un archivo llamado compound-function-query.js.

  2. Copia y pega el ejemplo de código en el archivo compound-function-query.js.

    El ejemplo de código realiza las siguientes tareas:

    • Importa mongodb, el controlador Node.js de MongoDB.

    • Crea una instancia de la clase MongoClient para establecer una conexión con el clúster.

    • Utiliza las siguientes cláusulas compuestas para consultar la colección:

      • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción function. La opción function añade lo siguiente mediante una expresión aritmética:

        • La puntuación de relevancia de la query para el término de búsqueda

        • El valor del campo numérico denominado imdb.rating o el número 2 para aquellos documentos que no tienen el campo imdb.rating.

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Utiliza las siguientes etapas de pipeline:

      • Etapa $limit para limitar la salida a 10 resultados

      • $project etapa para:

        • Excluir todos los campos salvo title y year

        • Agrega dos campos denominados score y highlights

    • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

    1const MongoClient = require("mongodb").MongoClient;
    2const assert = require("assert");
    3
    4const agg = [
    5 {
    6 '$search': {
    7 'index': 'default',
    8 'compound': {
    9 'must': [
    10 {
    11 'range': {
    12 'path': 'year',
    13 'gte': 2013,
    14 'lte': 2015
    15 }
    16 }
    17 ],
    18 'should': [
    19 {
    20 'text': {
    21 'query': 'snow',
    22 'path': 'title',
    23 'score': {
    24 'function': {
    25 'add': [
    26 {
    27 'path': {
    28 'value': 'imdb.rating',
    29 'undefined': 2
    30 }
    31 }, {
    32 'score': 'relevance'
    33 }
    34 ]
    35 }
    36 }
    37 }
    38 }
    39 ]
    40 }
    41 }
    42 }, {
    43 '$limit': 10
    44 }, {
    45 '$project': {
    46 '_id': 0,
    47 'title': 1,
    48 'year': 1,
    49 'score': {
    50 '$meta': 'searchScore'
    51 },
    52 'highlights': {
    53 '$meta': 'searchHighlights'
    54 }
    55 }
    56 }
    57];
    58
    59MongoClient.connect(
    60 "<connection-string>",
    61 async function (connectErr, client) {
    62 assert.equal(null, connectErr);
    63 const coll = client.db("sample_mflix").collection("movies");
    64 let cursor = await coll.aggregate(agg);
    65 await cursor.forEach((doc) => console.log(doc));
    66 client.close();
    67 }
    68);
  3. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  4. Ejecute el siguiente comando para consultar su colección:

    node compound-function-query.js
    '{"title":"The Snow White Murder Case","year":2014,"score":10.454826354980469,"highlights":[{"score":1.3525336980819702,"path":"title","texts":[{"value":"The ","type":"text"},{"value":"Snow","type":"hit"},{"value":" White Murder Case","type":"text"}]}]}'
    '{"title":"Snow on the Blades","year":2014,"score":10.3317232131958,"highlights":[{"score":1.3766303062438965,"path":"title","texts":[{"value":"Snow","type":"hit"},{"value":" on the Blades","type":"text"}]}]}'
    '{"title":"Dead Snow 2: Red vs. Dead","year":2014,"score":10.032526969909668,"highlights":[{"score":1.3924485445022583,"path":"title","texts":[{"value":"Dead ","type":"text"},{"value":"Snow","type":"hit"},{"value":" 2: Red vs. ","type":"text"}]}]}'
    '{"title":"Snow in Paradise","year":2014,"score":8.386146545410156,"highlights":[{"score":1.382846713066101,"path":"title","texts":[{"value":"Snow","type":"hit"},{"value":" in Paradise","type":"text"}]}]}'
    '{"year":2013,"title":"The Secret Life of Walter Mitty","score":1,"highlights":[]}'
    '{"title":"Jurassic World","year":2015,"score":1,"highlights":[]}'
    '{"title":"Action Jackson","year":2014,"score":1,"highlights":[]}'
    '{"year":2013,"title":"In Secret","score":1,"highlights":[]}'
    '{"title":"The Stanford Prison Experiment","year":2015,"score":1,"highlights":[]}'
    '{"year":2014,"title":"The Giver","score":1,"highlights":[]}'

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción function.

1
  1. Crea un archivo llamado compound-constant-query.py.

  2. Copia y pega el ejemplo de código en el archivo compound-constant.py.

    El siguiente ejemplo de código:

    • Importa pymongo, el controlador de Python de MongoDB, y el módulo dns, que es necesario para conectar pymongo a Atlas usando una cadena de conexión de lista de nodos iniciales de DNS.

    • Crea una instancia de la clase MongoClient para establecer una conexión con el clúster.

    • Utiliza las siguientes cláusulas compuestas para consultar la colección:

      • filter cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el texto operador para consultar el término snow en el campo title y alterar el score con la opción constant. La opción constant reemplaza todos los resultados de puntuación para el término de búsqueda con 5.

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Utiliza las siguientes etapas de pipeline:

      • Etapa $limit para limitar la salida a 10 resultados

      • $project etapa para:

        • Excluir todos los campos salvo title y year

        • Agrega dos campos denominados score y highlights

    • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

    1import pymongo
    2
    3# connect to your Atlas cluster
    4client = pymongo.MongoClient('<connection-string>')
    5
    6# define pipeline
    7pipeline = [
    8 {'$search': {
    9 'index': 'default',
    10 'compound': {
    11 'filter': [{'range': {'path': 'year', 'gte': 2013, 'lte': 2015}}],
    12 'should': [{'text': {'query': 'snow', 'path': 'title', 'score': {'constant': {'value': 5}}}}]},
    13 'highlight': {'path': 'title'}}},
    14 {'$limit': 10},
    15 {'$project': {'_id': 0, 'title': 1, 'year': 1,
    16 'score': {'$meta': 'searchScore'}, "highlights": {"$meta": "searchHighlights"}}}
    17]
    18
    19# run pipeline
    20result = client['sample_mflix']['movies'].aggregate(pipeline)
    21
    22# print results
    23for i in result:
    24 print(i)
  3. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  4. Ejecute el siguiente comando para consultar su colección:

    python compound-constant-query.py
    {'highlights': [{'path': 'title', 'score': 1.382846713066101, 'texts': [{'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' in Paradise'}]}], 'year': 2014, 'score': 5.0, 'title': 'Snow in Paradise'}
    {'highlights': [{'path': 'title', 'score': 1.3924485445022583, 'texts': [{'type': 'text', 'value': 'Dead '}, {'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' 2: Red vs. '}]}], 'year': 2014, 'score': 5.0, 'title': 'Dead Snow 2: Red vs. Dead'}
    {'highlights': [{'path': 'title', 'score': 1.3525336980819702, 'texts': [{'type': 'text', 'value': 'The '}, {'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' White Murder Case'}]}], 'year': 2014, 'score': 5.0, 'title': 'The Snow White Murder Case'}
    {'highlights': [{'path': 'title', 'score': 1.3766303062438965, 'texts': [{'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' on the Blades'}]}], 'year': 2014, 'score': 5.0, 'title': 'Snow on the Blades'}
    {'highlights': [], 'title': 'The Secret Life of Walter Mitty', 'score': 0.0, 'year': 2013}
    {'highlights': [], 'year': 2015, 'score': 0.0, 'title': 'Jurassic World'}
    {'highlights': [], 'year': 2014, 'score': 0.0, 'title': 'Action Jackson'}
    {'highlights': [], 'title': 'In Secret', 'score': 0.0, 'year': 2013}
    {'highlights': [], 'year': 2015, 'score': 0.0, 'title': 'The Stanford Prison Experiment'}
    {'highlights': [], 'title': 'The Giver', 'score': 0.0, 'year': 2014}

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción constant.

2
  1. Crea un archivo llamado compound-boost-query.py.

  2. Copia y pega el ejemplo de código en el archivo compound-boost-query.py.

    El siguiente ejemplo de código:

    • Importa pymongo, el controlador de Python de MongoDB, y el módulo dns, que es necesario para conectar pymongo a Atlas usando una cadena de conexión de lista de nodos iniciales de DNS.

    • Crea una instancia de la clase MongoClient para establecer una conexión con el clúster.

    • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

    La consulta utiliza las siguientes etapas del pipeline:

    • $search etapa para hacer queries a la colección. La query:

      • Usa las siguientes cláusulas del operador compound:

        • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

        • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción boost. La opción boost multiplica la puntuación base en los resultados para el término de búsqueda por 2.

        • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.
    • Etapa $limit para limitar la salida a 10 resultados

    • $project etapa para:

      • Excluir todos los campos salvo title y year

      • Agrega dos campos denominados score y highlights

    1import pymongo
    2
    3# connect to your Atlas cluster
    4client = pymongo.MongoClient('<connection-string>')
    5
    6# define pipeline
    7pipeline = [
    8 {'$search': {
    9 'index': 'default',
    10 'compound': {
    11 'must': [{'range': {'path': 'year', 'gte': 2013, 'lte': 2015}}],
    12 'should': [{'text': {'query': 'snow', 'path': 'title', 'score': {'boost': {'value': 2}}}}]},
    13 'highlight': {'path': 'title'}}},
    14 {'$limit': 10},
    15 {'$project': {'_id': 0, 'title': 1, 'year': 1, 'score': {'$meta': 'searchScore'}, "highlights": {"$meta": "searchHighlights"}}}
    16]
    17
    18# run pipeline
    19result = client['sample_mflix']['movies'].aggregate(pipeline)
    20
    21# print results
    22for i in result:
    23 print(i)

    La consulta utiliza las siguientes etapas del pipeline:

    • $search stage to query la colección. La query utiliza las siguientes cláusulas de operador compound con la opción boost para priorizar algunos campos más que otros:

      • must cláusula con el operador text para dar máxima prioridad al género comedy, seguido del término snow en el campo title. La opción boost aplica ponderaciones a los campos.

      • should cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      Nota

      La opción boost aplica diferentes pesos a los campos para priorizarlos.

    • $limit etapa para limitar la salida a 10 resultados.

    • $project preparar para:

      • Excluir todos los campos excepto title, year y genres

      • Añade un campo llamado score

    import pymongo
    import dns
    client = pymongo.MongoClient('<connection-string>')
    result = client['sample_mflix']['movies'].aggregate([
    {
    '$search': {
    'index': 'default',
    'compound': {
    'must': [
    {
    'text': {
    'path': 'genres',
    'query': 'comedy',
    'score': {
    'boost': {
    'value': 9
    }
    }
    }
    }, {
    'text': {
    'path': 'title',
    'query': 'snow',
    'score': {
    'boost': {
    'value': 5
    }
    }
    }
    }
    ],
    'should': [
    {
    'range': {
    'path': 'year',
    'gte': 2013,
    'lte': 2015,
    'score': {
    'boost': {
    'value': 3
    }
    }
    }
    }
    ]
    }
    }
    }, {
    '$limit': 10
    }, {
    '$project': {
    '_id': 0,
    'title': 1,
    'year': 1,
    'genres': 1,
    'score': {
    '$meta': 'searchScore'
    }
    }
    }
    ])
    for i in result:
    print(i)
  3. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  4. Ejecute el siguiente comando para consultar su colección:

    python compound-boost-query.py
    {'highlights': [{'path': 'title', 'score': 1.382846713066101, 'texts': [{'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' in Paradise'}]}], 'year': 2014, 'score': 6.7722930908203125, 'title': 'Snow in Paradise'}
    {'highlights': [{'path': 'title', 'score': 1.3766303062438965, 'texts': [{'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' on the Blades'}]}], 'year': 2014, 'score': 6.063445568084717, 'title': 'Snow on the Blades'}
    {'highlights': [{'path': 'title', 'score': 1.3525336980819702, 'texts': [{'type': 'text', 'value': 'The '}, {'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' White Murder Case'}]}], 'year': 2014, 'score': 5.509652137756348, 'title': 'The Snow White Murder Case'}
    {'highlights': [{'path': 'title', 'score': 1.3924485445022583, 'texts': [{'type': 'text', 'value': 'Dead '}, {'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' 2: Red vs. '}]}], 'year': 2014, 'score': 5.065053939819336, 'title': 'Dead Snow 2: Red vs. Dead'}
    {'highlights': [], 'title': 'The Secret Life of Walter Mitty', 'score': 1.0, 'year': 2013}
    {'highlights': [], 'year': 2015, 'score': 1.0, 'title': 'Jurassic World'}
    {'highlights': [], 'year': 2014, 'score': 1.0, 'title': 'Action Jackson'}
    {'highlights': [], 'title': 'In Secret', 'score': 1.0, 'year': 2013}
    {'highlights': [], 'year': 2015, 'score': 1.0, 'title': 'The Stanford Prison Experiment'}
    {'highlights': [], 'title': 'The Giver', 'score': 1.0, 'year': 2014}

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción boost.

    python compound-boost-query.py
    {
    'genres': ['Comedy', 'Horror'],
    'title': 'Dead Snow',
    'year': 2009,
    'score': 21.872983932495117
    }
    {
    'year': 2000,
    'genres': ['Adventure', 'Comedy', 'Family'],
    'title': 'Snow Day',
    'score': 21.043487548828125
    }
    {
    'genres': ['Adventure', 'Comedy', 'Family'],
    'title': 'Snow Dogs',
    'year': 2002,
    'score': 21.043487548828125
    }
    {
    'year': 1999,
    'genres': ['Comedy', 'Romance'],
    'title': 'Let It Snow',
    'score': 19.523927688598633
    }
    {
    'genres': ['Action', 'Comedy', 'Horror'],
    'title': 'Dead Snow 2: Red vs. Dead',
    'year': 2014,
    'score': 17.426334381103516
    }
    {
    'genres': ['Comedy', 'Drama'],
    'title': 'Snow White and Russian Red',
    'year': 2009,
    'score': 16.367326736450195
    }
    {
    'genres': ['Comedy', 'Drama', 'Romance'],
    'title': 'The Tiger and the Snow',
    'year': 2005,
    'score': 15.537829399108887
    }
    {
    'genres': ['Adventure', 'Comedy', 'Family'],
    'title': 'Snow White and the Three Stooges',
    'year': 1961,
    'score': 14.4263334274292
    }
3
  1. Crea un archivo llamado compound-function-query.py.

  2. Copia y pega el ejemplo de código en el archivo compound-function-query.py.

    El siguiente ejemplo de código:

    • Importa pymongo, el controlador de Python de MongoDB, y el módulo dns, que es necesario para conectar pymongo a Atlas usando una cadena de conexión de lista de nodos iniciales de DNS.

    • Crea una instancia de la clase MongoClient para establecer una conexión con el clúster.

    • Utiliza las siguientes cláusulas compuestas para consultar la colección:

      • must cláusula con el operador rango para buscar películas entre los años 2013 y 2015.

      • should cláusula con el operador text para consultar el término snow en el campo title y modificar el score con la opción function. La opción function añade lo siguiente mediante una expresión aritmética:

        • La puntuación de relevancia de la query para el término de búsqueda

        • El valor del campo numérico denominado imdb.rating o el número 2 para aquellos documentos que no tienen el campo imdb.rating.

    • Especifica la opción resaltar para devolver fragmentos de texto del campo title que coincidan con la query. Los fragmentos contienen texto coincidente especificado con type: 'hit' y texto adyacente especificado con type: 'text'.

    • Utiliza las siguientes etapas de pipeline:

      • Etapa $limit para limitar la salida a 10 resultados

      • $project etapa para:

        • Excluir todos los campos salvo title y year

        • Agrega dos campos denominados score y highlights

    • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

    1import pymongo
    2
    3# connect to your Atlas cluster
    4client = pymongo.MongoClient('<connection-string>')
    5
    6# define pipeline
    7pipeline = [
    8 {'$search': {
    9 'index': 'default',
    10 'compound': {
    11 'must': [{'range': {'path': 'year', 'gte': 2013, 'lte': 2015}}],
    12 'should': [{'text': {'query': 'snow', 'path': 'title',
    13 'score': {'function': {
    14 'add': [{'path': {'value': 'imdb.rating','undefined': 2}}, {'score': 'relevance'}]}}}}]},
    15 'highlight': {'path': 'title'}}},
    16 {'$limit': 10},
    17 {'$project': {'_id': 0, 'title': 1, 'year': 1, 'score': {'$meta': 'searchScore'}, "highlights": {"$meta": "searchHighlights"}}}
    18]
    19
    20# run pipeline
    21result = client['sample_mflix']['movies'].aggregate(pipeline)
    22
    23# print results
    24for i in result:
    25 print(i)
  3. Antes de ejecutar la muestra, reemplaza <connection-string> por tu cadena de conexión de Atlas. Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información, consulta Conectarse a un clúster a través de Librerías de clientes.

  4. Ejecute el siguiente comando para consultar su colección:

    python compound-function-query.py
    {'highlights': [{'path': 'title', 'score': 1.3525336980819702, 'texts': [{'type': 'text', 'value': 'The '}, {'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' White Murder Case'}]}], 'year': 2014, 'score': 10.454826354980469, 'title': 'The Snow White Murder Case'}
    {'highlights': [{'path': 'title', 'score': 1.3766303062438965, 'texts': [{'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' on the Blades'}]}], 'year': 2014, 'score': 10.3317232131958, 'title': 'Snow on the Blades'}
    {'highlights': [{'path': 'title', 'score': 1.3924485445022583, 'texts': [{'type': 'text', 'value': 'Dead '}, {'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' 2: Red vs. '}]}], 'year': 2014, 'score': 10.032526969909668, 'title': 'Dead Snow 2: Red vs. Dead'}
    {'highlights': [{'path': 'title', 'score': 1.382846713066101, 'texts': [{'type': 'hit', 'value': 'Snow'}, {'type': 'text', 'value': ' in Paradise'}]}], 'year': 2014, 'score': 8.386146545410156, 'title': 'Snow in Paradise'}
    {'highlights': [], 'title': 'The Secret Life of Walter Mitty', 'score': 1.0, 'year': 2013}
    {'highlights': [], 'year': 2015, 'score': 1.0, 'title': 'Jurassic World'}
    {'highlights': [], 'year': 2014, 'score': 1.0, 'title': 'Action Jackson'}
    {'highlights': [], 'title': 'In Secret', 'score': 1.0, 'year': 2013}
    {'highlights': [], 'year': 2015, 'score': 1.0, 'title': 'The Stanford Prison Experiment'}
    {'highlights': [], 'title': 'The Giver', 'score': 1.0, 'year': 2014}

    Los primeros cuatro documentos en los resultados tienen una puntuación más alta debido a que la cláusula should en la query especifica una preferencia por documentos con snow en el título. La cláusula should también modifica la puntuación del término de consulta snow usando la opción function.

Utiliza el operador compuesto para combinar dos o más operadores en una sola query y utiliza las opciones de puntuación para modificar la puntuación de relevancia que devuelve MongoDB Search.

Las siguientes queries de muestra utilizan los campos title, plot y genres en el namespace sample_mflix.movies para realizar las siguientes búsquedas:

  • Busca todas las películas que contengan la palabra "fantasma", pero reduce la puntuación de las películas de comedia en un 50%.

  • Busque todas las películas que contengan la palabra "fantasma", pero reduzca la puntuación de las películas con ObjectIds especificados en un 50%.

1

Puedes ir a la página de búsqueda de MongoDB desde la opción Search & Vector Search o desde el Data Explorer.

  1. Si aún no aparece, se debe seleccionar la organización que contiene el proyecto en el menú Organizations de la barra de navegación.

  2. Si aún no se muestra, seleccione su proyecto en el menú Projects de la barra de navegación.

  3. En la barra lateral, haz clic en Search & Vector Search en la sección Database.

    • Si no tienes clústeres, haz clic en Create cluster para crear uno. Para obtener más información, consulta Crear un clúster.

    • Si el proyecto tiene varios clústeres, se debe seleccionar el clúster que se desea usar en el menú desplegable Select cluster y luego se debe hacer clic en Go to Search.

    Aparece la página de Búsqueda y Búsqueda Vectorial.

  1. Si aún no aparece, se debe seleccionar la organización que contiene el proyecto en el menú Organizations de la barra de navegación.

  2. Si aún no se muestra, seleccione su proyecto en el menú Projects de la barra de navegación.

  3. En la barra lateral, haz clic en Data Explorer en la sección Database.

  4. Expanda la base de datos y seleccione la colección.

  5. Haga clic en la pestaña Indexes para la colección.

  6. Haga clic en el enlace Search and Vector Search en el banner.

    Aparece la página de Búsqueda y Búsqueda Vectorial.

2

Haz clic en el botón Query a la derecha del índice que deseas consultar.

3

Haz clic en Edit Query para ver una muestra de sintaxis de query por defecto en formato JSON.

4
  1. Copia y pega la siguiente query en el Query Editor.

    El query utiliza el operador $search compound should cláusula para anidar queries del operador compound que realizan las siguientes acciones:

    • Busca películas que contengan el término ghost en la trama o en el título (cláusula must) y que no sean del género comedy (cláusula mustNot).

    • Buscar películas que contengan el término ghost en el argumento o en el título (cláusula must), pero reducir (boost) la puntuación en un 50% (0.5) para las películas del género comedy con el término ghost en el título o argumento.

    1[
    2 {
    3 "$search": {
    4 "index": "default",
    5 "compound": {
    6 "should":[ {
    7 "compound":{
    8 "must":[
    9 {
    10 "text": {
    11 "query": "ghost",
    12 "path": ["plot","title"]
    13 }
    14 }
    15 ],
    16 "mustNot":[
    17 {
    18 "text": {
    19 "query": "Comedy",
    20 "path": ["genres"]
    21 }
    22 }
    23 ]
    24 }
    25 },
    26 {
    27 "compound":{
    28 "must":[
    29 {
    30 "text": {
    31 "query": "ghost",
    32 "path": ["plot","title"]
    33 }
    34 }
    35 ],
    36 "filter":[
    37 {
    38 "text": {
    39 "query": "Comedy",
    40 "path": ["genres"]
    41 }
    42 }
    43 ],
    44 "score":{ "boost": { "value": 0.5} }
    45 }
    46 }
    47 ]
    48 }
    49 }
    50 }
    51]

    El query utiliza el operador $search compound should cláusula para anidar queries del operador compound que realizan las siguientes acciones:

    • Busca películas que contengan el término ghost en el argumento o el título (cláusula must), pero que no tengan los Objetos Id especificados (cláusula mustNot).

    • Busca películas que contengan el término ghost en la trama o el título (cláusula must), pero reduce (boost) el puntaje en un 50% (0.5) para películas con los ObjectIds especificados (cláusula filter).

    1[
    2 {
    3 "$search": {
    4 "index": "default",
    5 "compound": {
    6 "should":[
    7 {
    8 "compound":{
    9 "must":[
    10 {
    11 "text": {
    12 "query": "ghost",
    13 "path": ["plot","title"]
    14 }
    15 }
    16 ],
    17 "mustNot":[
    18 {
    19 "in": {
    20 "value": [ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2')],
    21 "path": "_id"
    22 }
    23 }
    24 ]
    25 }
    26 },
    27 {
    28 "compound":{
    29 "must":[
    30 {
    31 "text": {
    32 "query": "ghost",
    33 "path": ["plot","title"]
    34 }
    35 }
    36 ],
    37 "filter":[
    38 {
    39 "in": {
    40 "value": [ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2')],
    41 "path": "_id"
    42 }
    43 }
    44 ],
    45 "score":{ "boost": { "value": 0.5} }
    46 }
    47 }
    48 ]
    49 }
    50 }
    51 }
    52]
  2. Haz clic en el botón Search en el Query Editor.

    1SCORE: 5.909613132476807
    2_id: “573a139af29313caabcefcce”
    3plot: "Adaption of the famous Oscar Wilde tale about a young American girl th…"
    4genres: Array (3)
    5runtime: 92
    6
    7SCORE: 5.367666244506836
    8_id: “573a13d8f29313caabda5dc1”
    9plot: "The Little Ghost lives in the castle over looking a small town and awa…"
    10genres: Array (2)
    11runtime: 92
    12
    13SCORE: 4.676314353942871
    14_id: “573a13c0f29313caabd6139d”
    15plot: "Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal …"
    16genres: Array (2)
    17runtime: 107
    18
    19SCORE: 3.9638845920562744
    20_id: “573a1398f29313caabcebf6f”
    21plot: "After an accident leaves a young man dead, his spirit stays behind to …"
    22genres: Array (3)
    23runtime: 127
    24
    25SCORE: 3.9638845920562744
    26_id: “573a13cdf29313caabd83c08”
    27plot: "A man tries to solve his lover's murder by communicating with her spir…"
    28genres: Array (3)
    29runtime: 115
    30
    31SCORE: 3.9638845920562744
    32_id: “573a13cef29313caabd873a2”
    33plot: "A man tries to solve his lover's murder by communicating with her spir…"
    34genres: Array (3)
    35runtime: 115
    36
    37SCORE: 3.526711940765381
    38_id: “573a13c3f29313caabd6a149”
    39plot: "What kind of scenes in a horror film scares you the most? When a ghost…"
    40genres: Array (2)
    41runtime: 95
    42
    43SCORE: 3.3177831172943115
    44_id: “573a1397f29313caabce7ea1”
    45plot: "Four successful elderly gentlemen, members of the Chowder Society, sha…"
    46genres: Array (3)
    47runtime: 110
    48
    49SCORE: 3.3177831172943115
    50_id: “573a13a4f29313caabd117df”
    51fullplot: "When the motorcyclist Johnny Blaze finds that his father Barton Blaze …"
    52imdb: Object
    53year: 2007
    54
    55SCORE: 3.3177831172943115
    56_id: “573a13a6f29313caabd185dc”
    57fullplot: "After discovering a passenger ship missing since 1962 floating adrift …"
    58imdb: Object
    59year: 2002

    Los documentos de películas en los resultados contienen el término de query ghost en el campo plot o title y no pertenecen al género Comedy. MongoDB Search no devolvió documentos del género Comedy con el término ghost en el campo plot o title porque esos documentos no se ubicaron entre los 10 principales, ya que la query redujo la puntuación de esos documentos en un 50%.

    1SCORE: 5.909613132476807
    2_id: “573a139af29313caabcefcce”
    3plot: "Adaption of the famous Oscar Wilde tale about a young American girl th…"
    4genres: Array (3)
    5runtime: 92
    6
    7SCORE: 5.367666244506836
    8_id: “573a13d8f29313caabda5dc1”
    9plot: "The Little Ghost lives in the castle over looking a small town and awa…"
    10genres: Array (2)
    11runtime: 92
    12
    13SCORE: 4.676314353942871
    14_id: “573a13c0f29313caabd6139d”
    15plot: "Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal …"
    16genres: Array (2)
    17runtime: 107
    18
    19SCORE: 3.9638845920562744
    20_id: “573a1398f29313caabcebf6f”
    21plot: "After an accident leaves a young man dead, his spirit stays behind to …"
    22genres: Array (3)
    23runtime: 127
    24
    25SCORE: 3.526711940765381
    26_id: “573a13c3f29313caabd6a149”
    27plot: "What kind of scenes in a horror film scares you the most? When a ghost…"
    28genres:Array (2)
    29runtime: 95
    30
    31SCORE: 3.5241782665252686
    32_id: “573a1398f29313caabce912c”
    33plot: "Three unemployed parapsychology professors set up shop as a unique gho…"
    34genres: Array (2)
    35runtime: 105
    36
    37SCORE: 3.5241782665252686
    38_id: “573a139cf29313caabcf5a48”
    39plot: "Casper, a ghost, teams up with Wendy, a witch, against an evil warlock…"
    40genres: Array (3)
    41runtime: 90
    42
    43SCORE: 3.4605300426483154
    44_id: “573a13bdf29313caabd58274”
    45plot: "Banku, his mother, Anjali Sharma and father move in to their new house…"
    46genres: Array (3)
    47runtime: 150
    48
    49SCORE: 3.3177831172943115
    50_id: “573a1397f29313caabce7ea1”
    51plot: "Four successful elderly gentlemen, members of the Chowder Society, sha…"
    52genres: Array (3)
    53runtime: 110
    54
    55SCORE: 3.3177831172943115
    56_id: “573a1398f29313caabcebf79”
    57plot: "Elliot Hopper is a widower with three children, he is currently workin…"
    58genres: Array (3)
    59runtime: 83

    Los documentos de la película en los resultados contienen el término de consulta ghost en el campo plot o title y no tienen los ObjectIds especificados en el campo _id. MongoDB Search no devolvió los documentos con los ObjectsIds especificados, aunque contienen el término de la query ghost en el campo title, porque la query redujo la puntuación de estos documentos en un 50% y, por tanto, estos documentos no se ubicaron en los primeros 10 documentos.

1

Se debe abrir mongosh en una ventana de terminal y realizar la conexión al clúster. Para obtener instrucciones detalladas sobre cómo realizar la conexión, se debe consultar Conexión a un clúster a través de mongosh.

2
use sample_mflix
switched to db sample_mflix
3

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en la trama o en el título (cláusula must) y que no sean del género comedy (cláusula mustNot).

  • Busca películas que contengan el término ghost en el argumento o en el título (cláusula must) y que sean del género comedy (cláusula filter), pero que reduzcan el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Incluye solo los campos _id, title, plot y genres de los documentos en los resultados.

  • Añade un campo llamado score que muestra la puntuación en los resultados.

1db.movies.aggregate([
2 {
3 "$search": {
4 "index": "default",
5 "compound": {
6 "should": [
7 {
8 "compound":{
9 "must": [
10 {
11 "text": {
12 "query": "ghost",
13 "path": ["plot","title"]
14 }
15 }
16 ],
17 "mustNot": [
18 {
19 "text": {
20 "query": "Comedy",
21 "path": ["genres"]
22 }
23 }
24 ]
25 }
26 },
27 {
28 "compound":{
29 "must":[
30 {
31 "text": {
32 "query": "ghost",
33 "path": ["plot","title"]
34 }
35 }
36 ],
37 "filter": [
38 {
39 "text": {
40 "query": "Comedy",
41 "path": ["genres"]
42 }
43 }
44 ],
45 "score": { "boost": { "value": 0.5} }
46 }
47 }
48 ]
49 }
50 }
51 },
52 {
53 "$limit": 10
54 },
55 {
56 "$project": {
57 "_id": 1,
58 "title": 1,
59 "plot": 1,
60 "genres": 1,
61 "score": { "$meta": "searchScore" }
62 }
63 }
64])
1[
2 {
3 _id: ObjectId('573a139af29313caabcefcce'),
4 plot: 'Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.',
5 genres: [ 'Family', 'Drama', 'Fantasy' ],
6 title: 'The Canterville Ghost',
7 score: 5.909613132476807
8 },
9 {
10 _id: ObjectId('573a13d8f29313caabda5dc1'),
11 plot: 'The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!',
12 genres: [ 'Family', 'Fantasy' ],
13 title: 'The Little Ghost',
14 score: 5.367666244506836
15 },
16 {
17 _id: ObjectId('573a13c0f29313caabd6139d'),
18 plot: 'Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.',
19 genres: [ 'Horror', 'Thriller' ],
20 title: 'Death of a Ghost Hunter',
21 score: 4.676314353942871
22 },
23 {
24 _id: ObjectId('573a1398f29313caabcebf6f'),
25 plot: 'After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.',
26 genres: [ 'Drama', 'Fantasy', 'Romance' ],
27 title: 'Ghost',
28 score: 3.9638845920562744
29 },
30 {
31 _id: ObjectId('573a13cdf29313caabd83c08'),
32 plot: "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.",
33 genres: [ 'Drama', 'Fantasy', 'Mystery' ],
34 title: 'Ghost',
35 score: 3.9638845920562744
36 },
37 {
38 _id: ObjectId('573a13cef29313caabd873a2'),
39 plot: "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.",
40 genres: [ 'Drama', 'Fantasy', 'Mystery' ],
41 title: 'Ghost',
42 score: 3.9638845920562744
43 },
44 {
45 _id: ObjectId('573a13c3f29313caabd6a149'),
46 plot: 'What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...',
47 genres: [ 'Horror', 'Thriller' ],
48 title: 'Coming Soon',
49 score: 3.526711940765381
50 },
51 {
52 _id: ObjectId('573a1397f29313caabce7ea1'),
53 plot: "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...",
54 genres: [ 'Drama', 'Horror', 'Thriller' ],
55 title: 'Ghost Story',
56 score: 3.3177831172943115
57 },
58 {
59 _id: ObjectId('573a13a4f29313caabd117df'),
60 plot: 'Stunt motorcyclist Johnny Blaze gives up his soul to become a hellblazing vigilante, to fight against power hungry Blackheart, the son of the devil himself.',
61 genres: [ 'Action', 'Fantasy', 'Thriller' ],
62 title: 'Ghost Rider',
63 score: 3.3177831172943115
64 },
65 {
66 _id: ObjectId('573a13a6f29313caabd185dc'),
67 plot: 'A salvage crew that discovers a long-lost 1962 passenger ship floating lifeless in a remote region of the Bering Sea soon notices, as they prepare to tow it back to land, that "strange things" happen...',
68 genres: [ 'Horror', 'Mystery' ],
69 title: 'Ghost Ship',
70 score: 3.3177831172943115
71 }
72]

Los documentos de películas en los resultados contienen el término de query ghost en el campo plot o title y no pertenecen al género Comedy. MongoDB Search no devolvió documentos del género Comedy con el término ghost en el campo plot o title porque esos documentos no se ubicaron entre los 10 principales, ya que la query redujo la puntuación de esos documentos en un 50%.

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en el argumento o el título (cláusula must), pero que no tengan los Objetos Id especificados (cláusula mustNot).

  • Busca películas que contengan el término ghost en la trama o el título (cláusula must) y tengan los ObjectId especificados (cláusula filter), pero reduce el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Solo incluye los campos title, plot y _id de los documentos de los resultados.

  • Agrega un campo llamado score que muestra la puntuación del documento en los resultados.

1db.movies.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "index": "default",
6 "should": [
7 {
8 "compound": {
9 "must": [
10 {
11 "text": {
12 "query": "ghost",
13 "path": ["plot","title"]
14 }
15 }
16 ],
17 "mustNot": [
18 {
19 "in": {
20 "value": [ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2')],
21 "path": "_id"
22 }
23 }
24 ]
25 }
26 },
27 {
28 "compound": {
29 "must": [
30 {
31 "text": {
32 "query": "ghost",
33 "path": ["plot","title"]
34 }
35 }
36 ],
37 "filter": [
38 {
39 "in": {
40 "value": [ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2')],
41 "path": "_id"
42 }
43 }
44 ],
45 "score": { "boost": { "value": 0.5} }
46 }
47 }
48 ]
49 }
50 }
51 },
52 {
53 "$limit": 10
54 },
55 {
56 "$project": {
57 "_id": 1,
58 "title": 1,
59 "plot": 1,
60 "score": { "$meta": "searchScore" }
61 }
62 }
63])
1[
2 {
3 _id: ObjectId('573a139af29313caabcefcce'),
4 plot: 'Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.',
5 genres: [ 'Family', 'Drama', 'Fantasy' ],
6 title: 'The Canterville Ghost',
7 score: 5.909613132476807
8 },
9 {
10 _id: ObjectId('573a13d8f29313caabda5dc1'),
11 plot: 'The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!',
12 genres: [ 'Family', 'Fantasy' ],
13 title: 'The Little Ghost',
14 score: 5.367666244506836
15 },
16 {
17 _id: ObjectId('573a13c0f29313caabd6139d'),
18 plot: 'Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.',
19 genres: [ 'Horror', 'Thriller' ],
20 title: 'Death of a Ghost Hunter',
21 score: 4.676314353942871
22 },
23 {
24 _id: ObjectId('573a1398f29313caabcebf6f'),
25 plot: 'After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.',
26 genres: [ 'Drama', 'Fantasy', 'Romance' ],
27 title: 'Ghost',
28 score: 3.9638845920562744
29 },
30 {
31 _id: ObjectId('573a13c3f29313caabd6a149'),
32 plot: 'What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...',
33 genres: [ 'Horror', 'Thriller' ],
34 title: 'Coming Soon',
35 score: 3.526711940765381
36 },
37 {
38 _id: ObjectId('573a1398f29313caabce912c'),
39 plot: 'Three unemployed parapsychology professors set up shop as a unique ghost removal service.',
40 genres: [ 'Comedy', 'Fantasy' ],
41 title: 'Ghostbusters',
42 score: 3.5241782665252686
43 },
44 {
45 _id: ObjectId('573a139cf29313caabcf5a48'),
46 plot: 'Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.',
47 genres: [ 'Adventure', 'Comedy', 'Family' ],
48 title: 'Casper Meets Wendy',
49 score: 3.5241782665252686
50 },
51 {
52 _id: ObjectId('573a13bdf29313caabd58274'),
53 plot: 'Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...',
54 genres: [ 'Comedy', 'Drama', 'Fantasy' ],
55 title: 'Bhoothnath',
56 score: 3.4605300426483154
57 },
58 {
59 _id: ObjectId('573a1397f29313caabce7ea1'),
60 plot: "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...",
61 genres: [ 'Drama', 'Horror', 'Thriller' ],
62 title: 'Ghost Story',
63 score: 3.3177831172943115
64 },
65 {
66 _id: ObjectId('573a1398f29313caabcebf79'),
67 plot: 'Elliot Hopper is a widower with three children, he is currently working on a deal. It seems like his wife illness was very costly and this deal could put them out of the red. However he ...',
68 genres: [ 'Comedy', 'Family', 'Fantasy' ],
69 title: 'Ghost Dad',
70 score: 3.3177831172943115
71 }
72]

Los documentos de la película en los resultados contienen el término de consulta ghost en el campo plot o title y no tienen los ObjectIds especificados en el campo _id. MongoDB Search no devolvió los documentos con los ObjectsIds especificados, aunque contienen el término de la query ghost en el campo title, porque la query redujo la puntuación de estos documentos en un 50% y, por tanto, estos documentos no se ubicaron en los primeros 10 documentos.

1

Abrir MongoDB Compass y realizar la conexión al clúster. Para obtener instrucciones detalladas sobre cómo realizar la conexión, se debe consultar Conectarse a un clúster a través de Compass.

2

En la pantalla Database, haz clic en la base de datos sample_mflix, luego haz clic en la colección movies.

3

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en la trama o en el título (cláusula must) y que no sean del género comedy (cláusula mustNot).

  • Busca películas que contengan el término ghost en el argumento o en el título (cláusula must) y que sean del género comedy (cláusula filter), pero que reduzcan el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Incluye solo los campos _id, title, plot y genres de los documentos en los resultados.

  • Añade un campo llamado score que muestra la puntuación en los resultados.

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en el argumento o el título (cláusula must), pero que no tengan los Objetos Id especificados (cláusula mustNot).

  • Busca películas que contengan el término ghost en la trama o el título (cláusula must) y tengan los ObjectId especificados (cláusula filter), pero reduce el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Solo incluye los campos title, plot y _id de los documentos de los resultados.

  • Agrega un campo llamado score que muestra la puntuación del documento en los resultados.

Para ejecutar esta consulta, sigue los pasos a continuación en MongoDB Compass:

  1. Haz clic en la pestaña Aggregations.

  2. Haz clic en Select..., luego configura cada una de las siguientes etapas del pipeline seleccionando la etapa en el menú desplegable y agregando la consulta para esa etapa.

    Tip

    Hacer clic en Add Stage para añadir etapas adicionales.

    etapa de pipeline
    Query

    $search

    {
    "index": "default",
    "compound": {
    "should": [
    {
    "compound":{
    "must": [
    {
    "text": {
    "query": "ghost",
    "path": ["plot","title"]
    }
    }
    ],
    "mustNot": [
    {
    "text": {
    "query": "Comedy",
    "path": ["genres"]
    }
    }
    ]
    }
    },
    {
    "compound":{
    "must":[
    {
    "text": {
    "query": "ghost",
    "path": ["plot","title"]
    }
    }
    ],
    "filter": [
    {
    "text": {
    "query": "Comedy",
    "path": ["genres"]
    }
    }
    ],
    "score": { "boost": { "value": 0.5} }
    }
    }
    ]
    }
    }

    $limit

    10

    $project

    {
    "_id": 1,
    "title": 1,
    "plot": 1,
    "genres": 1,
    "score": { "$meta": "searchScore" }
    }

    Si se habilita Auto Preview, MongoDB Compass muestra los siguientes documentos junto a la etapa de pipeline $project:

    1_id: ObjectId('573a139af29313caabcefcce'),
    2plot: 'Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.',
    3genres: [ 'Family', 'Drama', 'Fantasy' ],
    4title: 'The Canterville Ghost',
    5score: 5.909613132476807
    6
    7_id: ObjectId('573a13d8f29313caabda5dc1'),
    8plot: 'The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!',
    9genres: [ 'Family', 'Fantasy' ],
    10title: 'The Little Ghost',
    11score: 5.367666244506836
    12
    13_id: ObjectId('573a13c0f29313caabd6139d'),
    14plot: 'Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.',
    15genres: [ 'Horror', 'Thriller' ],
    16title: 'Death of a Ghost Hunter',
    17score: 4.676314353942871
    18
    19_id: ObjectId('573a1398f29313caabcebf6f'),
    20plot: 'After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.',
    21genres: [ 'Drama', 'Fantasy', 'Romance' ],
    22title: 'Ghost',
    23score: 3.9638845920562744
    24
    25_id: ObjectId('573a13cdf29313caabd83c08'),
    26plot: "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.",
    27genres: [ 'Drama', 'Fantasy', 'Mystery' ],
    28title: 'Ghost',
    29score: 3.9638845920562744
    30
    31_id: ObjectId('573a13cef29313caabd873a2'),
    32plot: "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.",
    33genres: [ 'Drama', 'Fantasy', 'Mystery' ],
    34title: 'Ghost',
    35score: 3.9638845920562744
    36
    37_id: ObjectId('573a13c3f29313caabd6a149'),
    38plot: 'What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...',
    39genres: [ 'Horror', 'Thriller' ],
    40title: 'Coming Soon',
    41score: 3.526711940765381
    42
    43_id: ObjectId('573a1397f29313caabce7ea1'),
    44plot: "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...",
    45genres: [ 'Drama', 'Horror', 'Thriller' ],
    46title: 'Ghost Story',
    47score: 3.3177831172943115
    48
    49_id: ObjectId('573a13a4f29313caabd117df'),
    50plot: 'Stunt motorcyclist Johnny Blaze gives up his soul to become a hellblazing vigilante, to fight against power hungry Blackheart, the son of the devil himself.',
    51genres: [ 'Action', 'Fantasy', 'Thriller' ],
    52title: 'Ghost Rider',
    53score: 3.3177831172943115
    54
    55_id: ObjectId('573a13a6f29313caabd185dc'),
    56plot: 'A salvage crew that discovers a long-lost 1962 passenger ship floating lifeless in a remote region of the Bering Sea soon notices, as they prepare to tow it back to land, that "strange things" happen...',
    57genres: [ 'Horror', 'Mystery' ],
    58title: 'Ghost Ship',
    59score: 3.3177831172943115

    Los documentos de películas en los resultados contienen el término de query ghost en el campo plot o title y no pertenecen al género Comedy. MongoDB Search no devolvió documentos del género Comedy con el término ghost en el campo plot o title porque esos documentos no se ubicaron entre los 10 principales, ya que la query redujo la puntuación de esos documentos en un 50%.

    etapa de pipeline
    Query

    $search

    {
    "index": "default",
    "compound": {
    "should": [
    {
    "compound":{
    "must": [
    {
    "text": {
    "query": "ghost",
    "path": ["plot","title"]
    }
    }
    ],
    "mustNot": [
    {
    "in": {
    "value": [ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2')],
    "path": "_id"
    }
    }
    ]
    }
    },
    {
    "compound":{
    "must":[
    {
    "text": {
    "query": "ghost",
    "path": ["plot","title"]
    }
    }
    ],
    "filter": [
    {
    "in": {
    "value": [ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2')],
    "path": "_id"
    }
    }
    ],
    "score": { "boost": { "value": 0.5} }
    }
    }
    ]
    }
    }

    $limit

    10

    $project

    {
    "_id": 1,
    "title": 1,
    "plot": 1,
    "score": { "$meta": "searchScore" }
    }

    Si se habilita Auto Preview, MongoDB Compass muestra los siguientes documentos junto a la etapa de pipeline $project:

    1_id: ObjectId('573a139af29313caabcefcce'),
    2plot: 'Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.',
    3title: 'The Canterville Ghost',
    4score: 5.909613132476807
    5
    6_id: ObjectId('573a13d8f29313caabda5dc1'),
    7plot: 'The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!',
    8title: 'The Little Ghost',
    9score: 5.367666244506836
    10
    11_id: ObjectId('573a13c0f29313caabd6139d'),
    12plot: 'Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.',
    13title: 'Death of a Ghost Hunter',
    14score: 4.676314353942871
    15
    16_id: ObjectId('573a1398f29313caabcebf6f'),
    17plot: 'After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.',
    18title: 'Ghost',
    19score: 3.9638845920562744
    20
    21_id: ObjectId('573a13c3f29313caabd6a149'),
    22plot: 'What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...',
    23title: 'Coming Soon',
    24score: 3.526711940765381
    25
    26_id: ObjectId('573a1398f29313caabce912c'),
    27plot: 'Three unemployed parapsychology professors set up shop as a unique ghost removal service.',
    28title: 'Ghostbusters',
    29score: 3.5241782665252686
    30
    31_id: ObjectId('573a139cf29313caabcf5a48'),
    32plot: 'Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.',
    33title: 'Casper Meets Wendy',
    34score: 3.5241782665252686
    35
    36_id: ObjectId('573a13bdf29313caabd58274'),
    37plot: 'Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...',
    38title: 'Bhoothnath',
    39score: 3.4605300426483154
    40
    41_id: ObjectId('573a1397f29313caabce7ea1'),
    42plot: "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...",
    43title: 'Ghost Story',
    44score: 3.3177831172943115
    45
    46_id: ObjectId('573a1398f29313caabcebf79'),
    47plot: 'Elliot Hopper is a widower with three children, he is currently working on a deal. It seems like his wife illness was very costly and this deal could put them out of the red. However he ...',
    48title: 'Ghost Dad',
    49score: 3.3177831172943115

    Los documentos de la película en los resultados contienen el término de consulta ghost en el campo plot o title y no tienen los ObjectIds especificados en el campo _id. MongoDB Search no devolvió los documentos con los ObjectsIds especificados, aunque contienen el término de la query ghost en el campo title, porque la query redujo la puntuación de estos documentos en un 50% y, por tanto, estos documentos no se ubicaron en los primeros 10 documentos.

1
  1. Crea un nuevo directorio llamado compound-bury-results e inicializa tu proyecto con el comando dotnet new.

    mkdir compound-bury-results
    cd compound-bury-results
    dotnet new console
  2. Agrega el driver .NET/C# a tu proyecto como una dependencia.

    dotnet add package MongoDB.Driver
2

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en la trama o en el título (cláusula must) y que no sean del género comedy (cláusula mustNot).

  • Busca películas que contengan el término ghost en el argumento o en el título (cláusula must) y que sean del género comedy (cláusula filter), pero que reduzcan el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Incluye solo los campos _id, title, plot y genres de los documentos en los resultados.

  • Añade un campo llamado score que muestra la puntuación en los resultados.

1using MongoDB.Bson;
2using MongoDB.Bson.Serialization.Attributes;
3using MongoDB.Bson.Serialization.Conventions;
4using MongoDB.Driver;
5using MongoDB.Driver.Search;
6
7public class BuryGenreCompoundExample
8{
9 private const string MongoConnectionString = "<connection-string>";
10
11 public static void Main(string[] args)
12 {
13 // allow automapping of the camelCase database fields to our MovieDocument
14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
16
17 // connect to your Atlas cluster
18 var mongoClient = new MongoClient(MongoConnectionString);
19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
21
22 // define and run pipeline
23 var results = moviesCollection.Aggregate()
24 .Search(Builders<MovieDocument>.Search.Compound()
25 .Should(Builders<MovieDocument>.Search.Compound()
26 .Must(Builders<MovieDocument>.Search.Text(
27 Builders<MovieDocument>.SearchPath.Multi(movie => movie.Title, movie => movie.Plot), "ghost"))
28 .MustNot(Builders<MovieDocument>.Search.Text(movie => movie.Genres, "Comedy"))
29 )
30 .Should(Builders<MovieDocument>.Search.Compound()
31 .Must(Builders<MovieDocument>.Search.Text(
32 Builders<MovieDocument>.SearchPath.Multi(movie => movie.Title, movie => movie.Plot), "ghost"))
33 .Filter(Builders<MovieDocument>.Search.Text(movie => movie.Genres, "Comedy", score: new SearchScoreDefinitionBuilder<MovieDocument>().Boost(0.5)))
34 ),
35 indexName: "default")
36 .Project<MovieDocument>(Builders<MovieDocument>.Projection
37 .Include(movie => movie.Plot)
38 .Include(movie => movie.Title)
39 .Include(movie => movie.Id)
40 .Include(movie => movie.Genres)
41 .MetaSearchScore("score"))
42 .Limit(10)
43 .ToList();
44
45 // print results
46 foreach (var movie in results)
47 {
48 Console.WriteLine(movie.ToJson());
49 }
50 }
51}
52
53[BsonIgnoreExtraElements]
54public class MovieDocument
55{
56 [BsonIgnoreIfDefault]
57 public ObjectId Id { get; set; }
58 public string Plot { get; set; }
59 public string Title { get; set; }
60 public string[] Genres { get; set; }
61 public double Score { get; set; }
62}

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en el argumento o el título (cláusula must), pero que no tengan los Objetos Id especificados (cláusula mustNot).

  • Busca películas que contengan el término ghost en la trama o el título (cláusula must) y tengan los ObjectId especificados (cláusula filter), pero reduce el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Solo incluye los campos title, plot y _id de los documentos de los resultados.

  • Agrega un campo llamado score que muestra la puntuación del documento en los resultados.

1using MongoDB.Bson;
2using MongoDB.Bson.Serialization.Attributes;
3using MongoDB.Bson.Serialization.Conventions;
4using MongoDB.Driver;
5using MongoDB.Driver.Search;
6
7public class BuryDocumentCompoundExample
8{
9 private const string MongoConnectionString = "<connection-string>";
10
11 public static void Main(string[] args)
12 {
13 // allow automapping of the camelCase database fields to our MovieDocument
14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
16
17 // connect to your Atlas cluster
18 var mongoClient = new MongoClient(MongoConnectionString);
19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
21
22 string id1 = "573a13cef29313caabd873a2";
23 string id2 = "573a13cdf29313caabd83c08";
24
25 // define and run pipeline
26 var results = moviesCollection.Aggregate()
27 .Search(Builders<MovieDocument>.Search.Compound()
28 .Should(Builders<MovieDocument>.Search.Compound()
29 .Must(Builders<MovieDocument>.Search.Text(
30 Builders<MovieDocument>.SearchPath.Multi(movie => movie.Title, movie => movie.Plot), "ghost"))
31 .MustNot(Builders<MovieDocument>.Search.In(movie => movie.Id, new[] {ObjectId.Parse(id1), ObjectId.Parse(id2)}))
32 )
33 .Should(Builders<MovieDocument>.Search.Compound()
34 .Must(Builders<MovieDocument>.Search.Text(
35 Builders<MovieDocument>.SearchPath.Multi(movie => movie.Title, movie => movie.Plot), "ghost"))
36 .Filter(Builders<MovieDocument>.Search.In(movie => movie.Id, new[] {ObjectId.Parse(id1), ObjectId.Parse(id2)}, score: new SearchScoreDefinitionBuilder<MovieDocument>().Boost(0.5)))
37 ),
38 indexName: "default")
39 .Project<MovieDocument>(Builders<MovieDocument>.Projection
40 .Include(movie => movie.Plot)
41 .Include(movie => movie.Title)
42 .Include(movie => movie.Id)
43 .MetaSearchScore("score"))
44 .Limit(10)
45 .ToList();
46
47 // print results
48 foreach (var movie in results)
49 {
50 Console.WriteLine(movie.ToJson());
51 }
52 }
53}
54
55[BsonIgnoreExtraElements]
56public class MovieDocument
57{
58 [BsonIgnoreIfDefault]
59 public ObjectId Id { get; set; }
60 public string Plot { get; set; }
61 public string Title { get; set; }
62 public double Score { get; set; }
63}
3

Asegúrate de que la cadena de conexión incluya las credenciales del usuario de base de datos. Para obtener más información, consulta Conectar a un clúster a través de las Librerías de clientes.

4
dotnet run compound-bury-results.csproj
{ "_id" : ObjectId("573a139af29313caabcefcce"), "plot" : "Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.", "title" : "The Canterville Ghost", "genres" : ["Family", "Drama", "Fantasy"], "score" : 5.9096131324768066 }
{ "_id" : ObjectId("573a13d8f29313caabda5dc1"), "plot" : "The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!", "title" : "The Little Ghost", "genres" : ["Family", "Fantasy"], "score" : 5.3676662445068359 }
{ "_id" : ObjectId("573a13c0f29313caabd6139d"), "plot" : "Renowned \"ghost hunter\", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.", "title" : "Death of a Ghost Hunter", "genres" : ["Horror", "Thriller"], "score" : 4.6763143539428711 }
{ "_id" : ObjectId("573a1398f29313caabcebf6f"), "plot" : "After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.", "title" : "Ghost", "genres" : ["Drama", "Fantasy", "Romance"], "score" : 3.9638845920562744 }
{ "_id" : ObjectId("573a13cdf29313caabd83c08"), "plot" : "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", "title" : "Ghost", "genres" : ["Drama", "Fantasy", "Mystery"], "score" : 3.9638845920562744 }
{ "_id" : ObjectId("573a13cef29313caabd873a2"), "plot" : "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", "title" : "Ghost", "genres" : ["Drama", "Fantasy", "Mystery"], "score" : 3.9638845920562744 }
{ "_id" : ObjectId("573a13c3f29313caabd6a149"), "plot" : "What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...", "title" : "Coming Soon", "genres" : ["Horror", "Thriller"], "score" : 3.5267119407653809 }
{ "_id" : ObjectId("573a1398f29313caabce912c"), "plot" : "Three unemployed parapsychology professors set up shop as a unique ghost removal service.", "title" : "Ghostbusters", "genres" : ["Comedy", "Fantasy"], "score" : 3.5241782665252686 }
{ "_id" : ObjectId("573a139cf29313caabcf5a48"), "plot" : "Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.", "title" : "Casper Meets Wendy", "genres" : ["Adventure", "Comedy", "Family"], "score" : 3.5241782665252686 }
{ "_id" : ObjectId("573a13bdf29313caabd58274"), "plot" : "Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...", "title" : "Bhoothnath", "genres" : ["Comedy", "Drama", "Fantasy"], "score" : 3.4605300426483154 }

Los documentos de películas en los resultados contienen el término de query ghost en el campo plot o title y no pertenecen al género Comedy. MongoDB Search no devolvió documentos del género Comedy con el término ghost en el campo plot o title porque esos documentos no se ubicaron entre los 10 principales, ya que la query redujo la puntuación de esos documentos en un 50%.

dotnet run compound-bury-results.csproj
{ "_id" : ObjectId("573a139af29313caabcefcce"), "plot" : "Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.", "title" : "The Canterville Ghost", "score" : 5.9096131324768066 }
{ "_id" : ObjectId("573a13d8f29313caabda5dc1"), "plot" : "The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!", "title" : "The Little Ghost", "score" : 5.3676662445068359 }
{ "_id" : ObjectId("573a13c0f29313caabd6139d"), "plot" : "Renowned \"ghost hunter\", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.", "title" : "Death of a Ghost Hunter", "score" : 4.6763143539428711 }
{ "_id" : ObjectId("573a1398f29313caabcebf6f"), "plot" : "After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.", "title" : "Ghost", "score" : 3.9638845920562744 }
{ "_id" : ObjectId("573a13cdf29313caabd83c08"), "plot" : "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", "title" : "Ghost", "score" : 3.9638845920562744 }
{ "_id" : ObjectId("573a13cef29313caabd873a2"), "plot" : "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", "title" : "Ghost", "score" : 3.9638845920562744 }
{ "_id" : ObjectId("573a13c3f29313caabd6a149"), "plot" : "What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...", "title" : "Coming Soon", "score" : 3.5267119407653809 }
{ "_id" : ObjectId("573a1398f29313caabce912c"), "plot" : "Three unemployed parapsychology professors set up shop as a unique ghost removal service.", "title" : "Ghostbusters", "score" : 3.5241782665252686 }
{ "_id" : ObjectId("573a139cf29313caabcf5a48"), "plot" : "Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.", "title" : "Casper Meets Wendy", "score" : 3.5241782665252686 }
{ "_id" : ObjectId("573a13bdf29313caabd58274"), "plot" : "Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...", "title" : "Bhoothnath", "score" : 3.4605300426483154 }

Los documentos de la película en los resultados contienen el término de consulta ghost en el campo plot o title y no tienen los ObjectIds especificados en el campo _id. MongoDB Search no devolvió los documentos con los ObjectsIds especificados, aunque contienen el término de la query ghost en el campo title, porque la query redujo la puntuación de estos documentos en un 50% y, por tanto, estos documentos no se ubicaron en los primeros 10 documentos.

1
2

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en la trama o en el título (cláusula must) y que no sean del género comedy (cláusula mustNot).

  • Busca películas que contengan el término ghost en el argumento o en el título (cláusula must) y que sean del género comedy (cláusula filter), pero que reduzcan el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Incluye solo los campos _id, title, plot y genres de los documentos en los resultados.

  • Añade un campo llamado score que muestra la puntuación en los resultados.

1package main
2
3import (
4 "context"
5 "fmt"
6 "time"
7
8 "go.mongodb.org/mongo-driver/v2/bson"
9 "go.mongodb.org/mongo-driver/v2/mongo"
10 "go.mongodb.org/mongo-driver/v2/mongo/options"
11)
12
13// define structure of movies collection
14type MovieCollection struct {
15 title string `bson:"Title,omitempty"`
16 plot string `bson:"Plot,omitempty"`
17}
18
19func main() {
20 var err error
21 // connect to the Atlas cluster and set a maximum operation time
22 ctx := context.Background()
23 opts := options.Client().
24 SetTimeout(5 * time.Second).
25 ApplyURI("<connection-string>")
26
27 client, err := mongo.Connect(opts)
28 if err != nil {
29 panic(err)
30 }
31 defer client.Disconnect(ctx)
32 // set namespace
33 collection := client.Database("sample_mflix").Collection("movies")
34 // define pipeline
35 searchStage := bson.D{{"$search", bson.D{
36 {"index", "default"},
37 {"compound", bson.D{
38 {"should", bson.A{
39 bson.D{{"compound", bson.D{
40 {"must", bson.A{
41 bson.D{{"text", bson.D{
42 {"query", "ghost"},
43 {"path", bson.A{"plot", "title"}},
44 }}},
45 }},
46 {"mustNot", bson.A{
47 bson.D{{"text", bson.D{
48 {"query", "Comedy"},
49 {"path", bson.A{"genres"}},
50 }}},
51 }},
52 }}},
53 bson.D{{"compound", bson.D{
54 {"must", bson.A{
55 bson.D{{"text", bson.D{
56 {"query", "ghost"},
57 {"path", bson.A{"plot", "title"}},
58 }}},
59 }},
60 {"filter", bson.A{
61 bson.D{{"text", bson.D{
62 {"query", "Comedy"},
63 {"path", bson.A{"genres"}},
64 }}},
65 }},
66 {"score", bson.D{{"boost", bson.D{{"value", 0.5}}}}},
67 }}},
68 }},
69 }},
70 }}}
71 limitStage := bson.D{{"$limit", 10}}
72 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"plot", 1}, {"_id", 0}, {"genres", 1}, {"score", bson.D{{"$meta", "searchScore"}}}}}}
73 // run pipeline
74 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage})
75 if err != nil {
76 panic(err)
77 }
78 // print results
79 var results []bson.D
80 if err = cursor.All(context.TODO(), &results); err != nil {
81 panic(err)
82 }
83 for _, result := range results {
84 fmt.Println(result)
85 }
86}

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en el argumento o el título (cláusula must), pero que no tengan los Objetos Id especificados (cláusula mustNot).

  • Busca películas que contengan el término ghost en la trama o el título (cláusula must) y tengan los ObjectId especificados (cláusula filter), pero reduce el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Solo incluye los campos title, plot y _id de los documentos de los resultados.

  • Agrega un campo llamado score que muestra la puntuación del documento en los resultados.

1package main
2
3import (
4 "context"
5 "fmt"
6 "log"
7 "time"
8
9 "go.mongodb.org/mongo-driver/v2/bson"
10 "go.mongodb.org/mongo-driver/v2/mongo"
11 "go.mongodb.org/mongo-driver/v2/mongo/options"
12)
13
14// define structure of movies collection
15type MovieCollection struct {
16 title string `bson:"Title,omitempty"`
17 plot string `bson:"Plot,omitempty"`
18}
19
20func main() {
21 var err error
22 // connect to the Atlas cluster and set a maximum operation time
23 ctx := context.Background()
24 opts := options.Client().
25 SetTimeout(5 * time.Second).
26 ApplyURI("<connection-string>")
27
28 client, err := mongo.Connect(opts)
29 if err != nil {
30 panic(err)
31 }
32 defer client.Disconnect(ctx)
33 // set namespace
34 collection := client.Database("sample_mflix").Collection("movies")
35 // define variable
36 var objectIDFromHex = func(hex string) bson.ObjectID {
37 objectID, err := bson.ObjectIDFromHex(hex)
38 if err != nil {
39 log.Fatal(err)
40 }
41 return objectID
42 }
43 // define pipeline
44 searchStage := bson.D{{"$search", bson.D{
45 {"index", "default"},
46 {"compound", bson.D{
47 {"should", bson.A{
48 bson.D{{"compound", bson.D{
49 {"must", bson.A{
50 bson.D{{"text", bson.D{
51 {"query", "ghost"},
52 {"path", bson.A{"plot", "title"}},
53 }}},
54 }},
55 {"mustNot", bson.A{
56 bson.D{{"in", bson.D{
57 {"value", bson.A{objectIDFromHex("573a13cdf29313caabd83c08"), objectIDFromHex("573a13cef29313caabd873a2")}},
58 {"path", "_id"},
59 }}},
60 }},
61 }}},
62 bson.D{{"compound", bson.D{
63 {"must", bson.A{
64 bson.D{{"text", bson.D{
65 {"query", "ghost"},
66 {"path", bson.A{"plot", "title"}},
67 }}},
68 }},
69 {"filter", bson.A{
70 bson.D{{"in", bson.D{
71 {"value", bson.A{objectIDFromHex("573a13cdf29313caabd83c08"), objectIDFromHex("573a13cef29313caabd873a2")}},
72 {"path", "_id"},
73 }}},
74 }},
75 {"score", bson.D{{"boost", bson.D{{"value", 0.5}}}}},
76 }}},
77 }},
78 }},
79 }}}
80
81 limitStage := bson.D{{"$limit", 10}}
82 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"plot", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}}}}
83 // run pipeline
84 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage})
85 if err != nil {
86 panic(err)
87 }
88 // print results
89 var results []bson.D
90 if err = cursor.All(context.TODO(), &results); err != nil {
91 panic(err)
92 }
93 for _, result := range results {
94 fmt.Println(result)
95 }
96}
3

Asegúrate de que la cadena de conexión incluya las credenciales del usuario de base de datos. Para obtener más información, consulta Conectar a un clúster a través de las Librerías de clientes.

4
go run compound-bury-results.go
[{plot Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.} {genres [Family Drama Fantasy]} {title The Canterville Ghost} {score 5.909613132476807}]
[{plot The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!} {genres [Family Fantasy]} {title The Little Ghost} {score 5.367666244506836}]
[{plot Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.} {genres [Horror Thriller]} {title Death of a Ghost Hunter} {score 4.676314353942871}]
[{plot After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.} {genres [Drama Fantasy Romance]} {title Ghost} {score 3.9638845920562744}]
[{plot A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.} {genres [Drama Fantasy Mystery]} {title Ghost} {score 3.9638845920562744}]
[{plot A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.} {genres [Drama Fantasy Mystery]} {title Ghost} {score 3.9638845920562744}]
[{plot What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...} {genres [Horror Thriller]} {title Coming Soon} {score 3.526711940765381}]
[{plot Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...} {genres [Drama Horror Thriller]} {title Ghost Story} {score 3.3177831172943115}]
[{plot Stunt motorcyclist Johnny Blaze gives up his soul to become a hellblazing vigilante, to fight against power hungry Blackheart, the son of the devil himself.} {genres [Action Fantasy Thriller]} {title Ghost Rider} {score 3.3177831172943115}]
[{plot A salvage crew that discovers a long-lost 1962 passenger ship floating lifeless in a remote region of the Bering Sea soon notices, as they prepare to tow it back to land, that "strange things" happen...} {genres [Horror Mystery]} {title Ghost Ship} {score 3.3177831172943115}]

Los documentos de películas en los resultados contienen el término de query ghost en el campo plot o title y no pertenecen al género Comedy. MongoDB Search no devolvió documentos del género Comedy con el término ghost en el campo plot o title porque esos documentos no se ubicaron entre los 10 principales, ya que la query redujo la puntuación de esos documentos en un 50%.

go run compound-bury-results.go
[{plot Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.} {title The Canterville Ghost} {score 5.909613132476807}]
[{plot The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!} {title The Little Ghost} {score 5.367666244506836}]
[{plot Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.} {title Death of a Ghost Hunter} {score 4.676314353942871}]
[{plot After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.} {title Ghost} {score 3.9638845920562744}]
[{plot What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...} {title Coming Soon} {score 3.526711940765381}]
[{plot Three unemployed parapsychology professors set up shop as a unique ghost removal service.} {title Ghostbusters} {score 3.5241782665252686}]
[{plot Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.} {title Casper Meets Wendy} {score 3.5241782665252686}]
[{plot Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...} {title Bhoothnath} {score 3.4605300426483154}]
[{plot Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...} {title Ghost Story} {score 3.3177831172943115}]
[{plot Elliot Hopper is a widower with three children, he is currently working on a deal. It seems like his wife illness was very costly and this deal could put them out of the red. However he ...} {title Ghost Dad} {score 3.3177831172943115}]

Los documentos de la película en los resultados contienen el término de consulta ghost en el campo plot o title y no tienen los ObjectIds especificados en el campo _id. MongoDB Search no devolvió los documentos con los ObjectsIds especificados, aunque contienen el término de la query ghost en el campo title, porque la query redujo la puntuación de estos documentos en un 50% y, por tanto, estos documentos no se ubicaron en los primeros 10 documentos.

1

junit

4.11 o una versión superior

mongodb-driver-sync

4.3.0 o una versión superior

slf4j-log4j12

1.7.30 o una versión superior

2
3

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en la trama o en el título (cláusula must) y que no sean del género comedy (cláusula mustNot).

  • Busca películas que contengan el término ghost en el argumento o en el título (cláusula must) y que sean del género comedy (cláusula filter), pero que reduzcan el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Incluye solo los campos _id, title, plot y genres de los documentos en los resultados.

  • Añade un campo llamado score que muestra la puntuación en los resultados.

1import java.util.Arrays;
2import static com.mongodb.client.model.Aggregates.limit;
3import static com.mongodb.client.model.Aggregates.project;
4import static com.mongodb.client.model.Projections.*;
5import com.mongodb.client.MongoClient;
6import com.mongodb.client.MongoClients;
7import com.mongodb.client.MongoCollection;
8import com.mongodb.client.MongoDatabase;
9
10import org.bson.Document;
11
12public class CompoundBuryQuery {
13 public static void main( String[] args ) {
14 // define query
15 Document agg =
16 new Document("$search",
17 new Document("index", "default")
18 .append("compound",
19 new Document("should", Arrays.asList(new Document("compound",
20 new Document("must", Arrays.asList(new Document("text",
21 new Document("query", "ghost")
22 .append("path", Arrays.asList("plot", "title")))))
23 .append("mustNot", Arrays.asList(new Document("text",
24 new Document("query", "Comedy")
25 .append("path", Arrays.asList("genres")))))
26 ),
27 new Document("compound",
28 new Document("must", Arrays.asList(new Document("text",
29 new Document("query", "ghost")
30 .append("path", Arrays.asList("plot", "title")))))
31 .append("filter", Arrays.asList(new Document("text",
32 new Document("query", "Comedy")
33 .append("path", Arrays.asList("genres")))))
34 .append("score", new Document("boost",
35 new Document("value", 0.5d))))))
36 )
37 );
38 // specify connection
39 String uri = "<connection-string>";
40 // establish connection and set namespace
41 try (MongoClient mongoClient = MongoClients.create(uri)) {
42 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
43 MongoCollection<Document> collection = database.getCollection("movies");
44 // run query and print results
45 collection.aggregate(Arrays.asList(agg,
46 limit(10),
47 project(fields(
48 include("title", "plot", "genres", "_id"),
49 computed("score", new Document("$meta", "searchScore"))))))
50 .forEach(doc -> System.out.println(doc.toJson()));
51 }
52 }
53}

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en el argumento o el título (cláusula must), pero que no tengan los Objetos Id especificados (cláusula mustNot).

  • Busca películas que contengan el término ghost en la trama o el título (cláusula must) y tengan los ObjectId especificados (cláusula filter), pero reduce el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Solo incluye los campos title, plot y _id de los documentos de los resultados.

  • Agrega un campo llamado score que muestra la puntuación del documento en los resultados.

1import java.util.Arrays;
2import static com.mongodb.client.model.Aggregates.limit;
3import static com.mongodb.client.model.Aggregates.project;
4import static com.mongodb.client.model.Projections.*;
5import com.mongodb.client.MongoClient;
6import com.mongodb.client.MongoClients;
7import com.mongodb.client.MongoCollection;
8import com.mongodb.client.MongoDatabase;
9import org.bson.types.ObjectId;
10
11import org.bson.Document;
12
13public class CompoundBuryQuery {
14 public static void main( String[] args ) {
15 // define query
16 Document agg =
17 new Document("$search",
18 new Document("index", "default")
19 .append("compound",
20 new Document("should", Arrays.asList(
21 new Document("compound",
22 new Document("must", Arrays.asList(new Document("text",
23 new Document("query", "ghost")
24 .append("path", Arrays.asList("plot", "title")))))
25 .append("mustNot", Arrays.asList(new Document("in",
26 new Document("value", Arrays.asList(new ObjectId("573a13cdf29313caabd83c08"),
27 new ObjectId("573a13cef29313caabd873a2")))
28 .append("path", "_id"))))),
29 new Document("compound",
30 new Document("must", Arrays.asList(new Document("text",
31 new Document("query", "ghost")
32 .append("path", Arrays.asList("plot", "title")))))
33 .append("filter", Arrays.asList(new Document("in",
34 new Document("value", Arrays.asList(new ObjectId("573a13cdf29313caabd83c08"),
35 new ObjectId("573a13cef29313caabd873a2")))
36 .append("path", "_id"))))
37 .append("score", new Document("boost",
38 new Document("value", 0.5d)))))
39 )
40 )
41 );
42 // specify connection
43 String uri = "<connection-string>";
44 // establish connection and set namespace
45 try (MongoClient mongoClient = MongoClients.create(uri)) {
46 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
47 MongoCollection<Document> collection = database.getCollection("movies");
48 // run query and print results
49 collection.aggregate(Arrays.asList(agg,
50 limit(10),
51 project(fields(
52 include("title", "plot", "_id"),
53 computed("score", new Document("$meta", "searchScore"))))))
54 .forEach(doc -> System.out.println(doc.toJson()));
55 }
56 }
57}
4

Asegúrate de que la cadena de conexión incluya las credenciales del usuario de base de datos. Para obtener más información, consulta Conectar a un clúster a través de las Librerías de clientes.

5
javac CompoundBuryQuery.java
{"_id": {"$oid": "573a139af29313caabcefcce"}, "plot": "Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.", "genres": ["Family", "Drama", "Fantasy"], "title": "The Canterville Ghost", "score": 5.909613132476807}
{"_id": {"$oid": "573a13d8f29313caabda5dc1"}, "plot": "The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!", "genres": ["Family", "Fantasy"], "title": "The Little Ghost", "score": 5.367666244506836}
{"_id": {"$oid": "573a13c0f29313caabd6139d"}, "plot": "Renowned \"ghost hunter\", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.", "genres": ["Horror", "Thriller"], "title": "Death of a Ghost Hunter", "score": 4.676314353942871}
{"_id": {"$oid": "573a1398f29313caabcebf6f"}, "plot": "After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.", "genres": ["Drama", "Fantasy", "Romance"], "title": "Ghost", "score": 3.9638845920562744}
{"_id": {"$oid": "573a13cdf29313caabd83c08"}, "plot": "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", "genres": ["Drama", "Fantasy", "Mystery"], "title": "Ghost", "score": 3.9638845920562744}
{"_id": {"$oid": "573a13cef29313caabd873a2"}, "plot": "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", "genres": ["Drama", "Fantasy", "Mystery"], "title": "Ghost", "score": 3.9638845920562744}
{"_id": {"$oid": "573a13c3f29313caabd6a149"}, "plot": "What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...", "genres": ["Horror", "Thriller"], "title": "Coming Soon", "score": 3.526711940765381}
{"_id": {"$oid": "573a1397f29313caabce7ea1"}, "plot": "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...", "genres": ["Drama", "Horror", "Thriller"], "title": "Ghost Story", "score": 3.3177831172943115}
{"_id": {"$oid": "573a13a4f29313caabd117df"}, "plot": "Stunt motorcyclist Johnny Blaze gives up his soul to become a hellblazing vigilante, to fight against power hungry Blackheart, the son of the devil himself.", "genres": ["Action", "Fantasy", "Thriller"], "title": "Ghost Rider", "score": 3.3177831172943115}
{"_id": {"$oid": "573a13a6f29313caabd185dc"}, "plot": "A salvage crew that discovers a long-lost 1962 passenger ship floating lifeless in a remote region of the Bering Sea soon notices, as they prepare to tow it back to land, that \"strange things\" happen...", "genres": ["Horror", "Mystery"], "title": "Ghost Ship", "score": 3.3177831172943115}

Los documentos de películas en los resultados contienen el término de query ghost en el campo plot o title y no pertenecen al género Comedy. MongoDB Search no devolvió documentos del género Comedy con el término ghost en el campo plot o title porque esos documentos no se ubicaron entre los 10 principales, ya que la query redujo la puntuación de esos documentos en un 50%.

javac CompoundBuryQuery.java
{"_id": {"$oid": "573a139af29313caabcefcce"}, "plot": "Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.", "title": "The Canterville Ghost", "score": 5.909613132476807}
{"_id": {"$oid": "573a13d8f29313caabda5dc1"}, "plot": "The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!", "title": "The Little Ghost", "score": 5.367666244506836}
{"_id": {"$oid": "573a13c0f29313caabd6139d"}, "plot": "Renowned \"ghost hunter\", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.", "title": "Death of a Ghost Hunter", "score": 4.676314353942871}
{"_id": {"$oid": "573a1398f29313caabcebf6f"}, "plot": "After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.", "title": "Ghost", "score": 3.9638845920562744}
{"_id": {"$oid": "573a13c3f29313caabd6a149"}, "plot": "What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...", "title": "Coming Soon", "score": 3.526711940765381}
{"_id": {"$oid": "573a1398f29313caabce912c"}, "plot": "Three unemployed parapsychology professors set up shop as a unique ghost removal service.", "title": "Ghostbusters", "score": 3.5241782665252686}
{"_id": {"$oid": "573a139cf29313caabcf5a48"}, "plot": "Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.", "title": "Casper Meets Wendy", "score": 3.5241782665252686}
{"_id": {"$oid": "573a13bdf29313caabd58274"}, "plot": "Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...", "title": "Bhoothnath", "score": 3.4605300426483154}
{"_id": {"$oid": "573a1397f29313caabce7ea1"}, "plot": "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...", "title": "Ghost Story", "score": 3.3177831172943115}
{"_id": {"$oid": "573a1398f29313caabcebf79"}, "plot": "Elliot Hopper is a widower with three children, he is currently working on a deal. It seems like his wife illness was very costly and this deal could put them out of the red. However he ...", "title": "Ghost Dad", "score": 3.3177831172943115}

Los documentos de la película en los resultados contienen el término de consulta ghost en el campo plot o title y no tienen los ObjectIds especificados en el campo _id. MongoDB Search no devolvió los documentos con los ObjectsIds especificados, aunque contienen el término de la query ghost en el campo title, porque la query redujo la puntuación de estos documentos en un 50% y, por tanto, estos documentos no se ubicaron en los primeros 10 documentos.

1

mongodb-driver-kotlin-coroutine

4.10.0 o una versión superior

2
3

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en la trama o en el título (cláusula must) y que no sean del género comedy (cláusula mustNot).

  • Busca películas que contengan el término ghost en el argumento o en el título (cláusula must) y que sean del género comedy (cláusula filter), pero que reduzcan el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Incluye solo los campos _id, title, plot y genres de los documentos en los resultados.

  • Añade un campo llamado score que muestra la puntuación en los resultados.

1import com.mongodb.client.model.Aggregates.limit
2import com.mongodb.client.model.Aggregates.project
3import com.mongodb.client.model.Projections.*
4import com.mongodb.kotlin.client.coroutine.MongoClient
5import kotlinx.coroutines.runBlocking
6import org.bson.Document
7
8fun main() {
9 // establish connection and set namespace
10 val uri = "<connection-string>"
11 val mongoClient = MongoClient.create(uri)
12 val database = mongoClient.getDatabase("sample_mflix")
13 val collection = database.getCollection<Document>("movies")
14
15 runBlocking {
16 // define clauses
17 val mustClause = listOf(
18 Document("text",
19 Document("query", "ghost")
20 .append("path", listOf("plot","title"))
21 )
22 )
23
24 val mustNotClauseAndFilterClause = listOf(
25 Document("text",
26 Document("query", "Comedy")
27 .append("path", listOf("genres"))
28 )
29 )
30
31 val compound1 = Document("must", mustClause)
32 .append("mustNot", mustNotClauseAndFilterClause)
33
34 val compound2 = Document("must", mustClause)
35 .append("filter", mustNotClauseAndFilterClause)
36 .append("score",
37 Document("boost",
38 Document("value", 0.5)
39 )
40 )
41
42 val agg = Document("\$search",
43 Document("index", "default")
44 .append("compound", Document("should", listOf(
45 Document("compound", compound1),
46 Document("compound", compound2)
47 )))
48 )
49
50 val resultsFlow = collection.aggregate<Document>(
51 listOf(
52 agg,
53 limit(10),
54 project(fields(
55 include("title", "plot", "genres"),
56 computed("score", Document("\$meta", "searchScore"))
57 ))
58 )
59 )
60 resultsFlow.collect { println(it) }
61 }
62 mongoClient.close()
63}

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en el argumento o el título (cláusula must), pero que no tengan los Objetos Id especificados (cláusula mustNot).

  • Busca películas que contengan el término ghost en la trama o el título (cláusula must) y tengan los ObjectId especificados (cláusula filter), pero reduce el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Solo incluye los campos title, plot y _id de los documentos de los resultados.

  • Agrega un campo llamado score que muestra la puntuación del documento en los resultados.

1import com.mongodb.client.model.Aggregates.limit
2import com.mongodb.client.model.Aggregates.project
3import com.mongodb.client.model.Projections.*
4import com.mongodb.kotlin.client.coroutine.MongoClient
5import kotlinx.coroutines.runBlocking
6import org.bson.Document
7import org.bson.types.ObjectId
8
9fun main() {
10 // establish connection and set namespace
11 val uri = "<connection-string>"
12 val mongoClient = MongoClient.create(uri)
13 val database = mongoClient.getDatabase("sample_mflix")
14 val collection = database.getCollection<Document>("movies")
15
16 runBlocking {
17 // define clauses
18 val mustClause = listOf(
19 Document("text",
20 Document("query", "ghost")
21 .append("path", listOf("plot","title"))
22 )
23 )
24
25 val mustNotClauseAndFilterClause = listOf(
26 Document("in",
27 Document("value", listOf(ObjectId("573a13cdf29313caabd83c08"), ObjectId("573a13cef29313caabd873a2")))
28 .append("path", "_id")
29 )
30 )
31
32 val compound1 = Document("must", mustClause)
33 .append("mustNot", mustNotClauseAndFilterClause)
34
35 val compound2 = Document("must", mustClause)
36 .append("filter", mustNotClauseAndFilterClause)
37 .append("score",
38 Document("boost",
39 Document("value", 0.5)
40 )
41 )
42
43 val agg = Document("\$search",
44 Document("index", "default")
45 .append("compound", Document("should", listOf(
46 Document("compound", compound1),
47 Document("compound", compound2)
48 )))
49 )
50
51 val resultsFlow = collection.aggregate<Document>(
52 listOf(
53 agg,
54 limit(10),
55 project(fields(
56 include("title", "plot", "_id"),
57 computed("score", Document("\$meta", "searchScore"))
58 ))
59 )
60 )
61 resultsFlow.collect { println(it) }
62 }
63 mongoClient.close()
64}
4

Asegúrate de que la cadena de conexión incluya las credenciales del usuario de base de datos. Para obtener más información, consulta Conectar a un clúster a través de las Librerías de clientes.

5

Cuando se ejecuta el programa CompoundBuryQuery.kt en el IDE, este imprime los siguientes documentos:

dotnet run compound-bury-results.csproj
Document{{_id=573a139af29313caabcefcce, plot=Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness., genres=[Family, Drama, Fantasy], title=The Canterville Ghost, score=5.909613132476807}}
Document{{_id=573a13d8f29313caabda5dc1, plot=The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!, genres=[Family, Fantasy], title=The Little Ghost, score=5.367666244506836}}
Document{{_id=573a13c0f29313caabd6139d, plot=Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror., genres=[Horror, Thriller], title=Death of a Ghost Hunter, score=4.676314353942871}}
Document{{_id=573a1398f29313caabcebf6f, plot=After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic., genres=[Drama, Fantasy, Romance], title=Ghost, score=3.9638845920562744}}
Document{{_id=573a13cdf29313caabd83c08, plot=A man tries to solve his lover's murder by communicating with her spirit through the help of a medium., genres=[Drama, Fantasy, Mystery], title=Ghost, score=3.9638845920562744}}
Document{{_id=573a13cef29313caabd873a2, plot=A man tries to solve his lover's murder by communicating with her spirit through the help of a medium., genres=[Drama, Fantasy, Mystery], title=Ghost, score=3.9638845920562744}}
Document{{_id=573a13c3f29313caabd6a149, plot=What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ..., genres=[Horror, Thriller], title=Coming Soon, score=3.526711940765381}}
Document{{_id=573a1397f29313caabce7ea1, plot=Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ..., genres=[Drama, Horror, Thriller], title=Ghost Story, score=3.3177831172943115}}
Document{{_id=573a13a4f29313caabd117df, plot=Stunt motorcyclist Johnny Blaze gives up his soul to become a hellblazing vigilante, to fight against power hungry Blackheart, the son of the devil himself., genres=[Action, Fantasy, Thriller], title=Ghost Rider, score=3.3177831172943115}}
Document{{_id=573a13a6f29313caabd185dc, plot=A salvage crew that discovers a long-lost 1962 passenger ship floating lifeless in a remote region of the Bering Sea soon notices, as they prepare to tow it back to land, that "strange things" happen..., genres=[Horror, Mystery], title=Ghost Ship, score=3.3177831172943115}}

Los documentos de películas en los resultados contienen el término de query ghost en el campo plot o title y no pertenecen al género Comedy. MongoDB Search no devolvió documentos del género Comedy con el término ghost en el campo plot o title porque esos documentos no se ubicaron entre los 10 principales, ya que la query redujo la puntuación de esos documentos en un 50%.

dotnet run compound-bury-results.csproj
Document{{_id=573a139af29313caabcefcce, plot=Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness., title=The Canterville Ghost, score=5.909613132476807}}
Document{{_id=573a13d8f29313caabda5dc1, plot=The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!, title=The Little Ghost, score=5.367666244506836}}
Document{{_id=573a13c0f29313caabd6139d, plot=Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror., title=Death of a Ghost Hunter, score=4.676314353942871}}
Document{{_id=573a1398f29313caabcebf6f, plot=After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic., title=Ghost, score=3.9638845920562744}}
Document{{_id=573a13c3f29313caabd6a149, plot=What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ..., title=Coming Soon, score=3.526711940765381}}
Document{{_id=573a1398f29313caabce912c, plot=Three unemployed parapsychology professors set up shop as a unique ghost removal service., title=Ghostbusters, score=3.5241782665252686}}
Document{{_id=573a139cf29313caabcf5a48, plot=Casper, a ghost, teams up with Wendy, a witch, against an evil warlock., title=Casper Meets Wendy, score=3.5241782665252686}}
Document{{_id=573a13bdf29313caabd58274, plot=Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy..., title=Bhoothnath, score=3.4605300426483154}}
Document{{_id=573a1397f29313caabce7ea1, plot=Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ..., title=Ghost Story, score=3.3177831172943115}}
Document{{_id=573a1398f29313caabcebf79, plot=Elliot Hopper is a widower with three children, he is currently working on a deal. It seems like his wife illness was very costly and this deal could put them out of the red. However he ..., title=Ghost Dad, score=3.3177831172943115}}

Los documentos de la película en los resultados contienen el término de consulta ghost en el campo plot o title y no tienen los ObjectIds especificados en el campo _id. MongoDB Search no devolvió los documentos con los ObjectsIds especificados, aunque contienen el término de la query ghost en el campo title, porque la query redujo la puntuación de estos documentos en un 50% y, por tanto, estos documentos no se ubicaron en los primeros 10 documentos.

1
2

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en la trama o en el título (cláusula must) y que no sean del género comedy (cláusula mustNot).

  • Busca películas que contengan el término ghost en el argumento o en el título (cláusula must) y que sean del género comedy (cláusula filter), pero que reduzcan el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Incluye solo los campos _id, title, plot y genres de los documentos en los resultados.

  • Añade un campo llamado score que muestra la puntuación en los resultados.

1const { MongoClient } = require("mongodb");
2
3// connect to your Atlas cluster
4const uri = "<connection-string>";
5const client = new MongoClient(uri);
6
7async function run() {
8 try {
9 await client.connect();
10
11 // set namespace
12 const database = client.db("sample_mflix");
13 const coll = database.collection("movies");
14
15 // define pipeline
16 const agg = [
17 {
18 "$search": {
19 "index": "default",
20 "compound": {
21 "should": [
22 {
23 "compound": {
24 "must": [
25 {
26 "text": {
27 "query": "ghost",
28 "path": [
29 "plot", "title"
30 ]
31 }
32 }
33 ],
34 "mustNot": [
35 {
36 "text": {
37 "query": "Comedy",
38 "path": [
39 "genres"
40 ]
41 }
42 }
43 ]
44 }
45 }, {
46 "compound": {
47 "must": [
48 {
49 "text": {
50 "query": "ghost",
51 "path": [
52 "plot", "title"
53 ]
54 }
55 }
56 ],
57 "filter": [
58 {
59 "text": {
60 "query": "Comedy",
61 "path": [
62 "genres"
63 ]
64 }
65 }
66 ],
67 "score": { "boost": { "value": 0.5 } }
68 }
69 }
70 ]
71 }
72 }
73 }, {
74 "$limit": 10
75 }, {
76 "$project": {
77 "_id": 1,
78 "title": 1,
79 "plot": 1,
80 "genres": 1,
81 "score": { "$meta": "searchScore" }
82 }
83 }
84 ];
85
86 // run pipeline
87 const result = coll.aggregate(agg);
88
89 // print results
90 await result.forEach((doc) => console.dir(JSON.stringify(doc)));
91 } finally {
92 await client.close();
93 }
94}
95run().catch(console.dir);

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en el argumento o el título (cláusula must), pero que no tengan los Objetos Id especificados (cláusula mustNot).

  • Busca películas que contengan el término ghost en la trama o el título (cláusula must) y tengan los ObjectId especificados (cláusula filter), pero reduce el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Solo incluye los campos title, plot y _id de los documentos de los resultados.

  • Agrega un campo llamado score que muestra la puntuación del documento en los resultados.

1const { MongoClient } = require("mongodb");
2const { ObjectId } = require("mongodb");
3
4// connect to your Atlas cluster
5const uri = "<connection-string>";
6const client = new MongoClient(uri);
7
8async function run() {
9 try {
10 await client.connect();
11
12 // set namespace
13 const database = client.db("sample_mflix");
14 const coll = database.collection("movies");
15
16 // define pipeline
17 const agg = [
18 {
19 '$search': {
20 'index': 'default',
21 'compound': {
22 'should': [
23 {
24 'compound': {
25 'must': [
26 {
27 'text': {
28 'query': 'ghost',
29 'path': [ 'plot', 'title' ]
30 }
31 }
32 ],
33 'mustNot': [
34 {
35 'in': {
36 'value': [ new ObjectId('573a13cdf29313caabd83c08'), new ObjectId('573a13cef29313caabd873a2') ],
37 'path': '_id'
38 }
39 }
40 ]
41 }
42 }, {
43 'compound': {
44 'must': [
45 {
46 'text': {
47 'query': 'ghost',
48 'path': [ 'plot', 'title' ]
49 }
50 }
51 ],
52 'filter': [
53 {
54 'in': {
55 'value': [ new ObjectId('573a13cdf29313caabd83c08'), new ObjectId('573a13cef29313caabd873a2') ],
56 'path': '_id'
57 }
58 }
59 ],
60 'score': {
61 'boost': { 'value': 0.5 }
62 }
63 }
64 }
65 ]
66 }
67 }
68 }, {
69 '$limit': 10
70 }, {
71 '$project': {
72 '_id': 1,
73 'title': 1,
74 'plot': 1,
75 'score': { '$meta': 'searchScore' }
76 }
77 }
78 ];
79
80 // run pipeline
81 const result = coll.aggregate(agg);
82
83 // print results
84 await result.forEach((doc) => console.dir(JSON.stringify(doc)));
85 } finally {
86 await client.close();
87 }
88}
89run().catch(console.dir);
3

Asegúrate de que la cadena de conexión incluya las credenciales del usuario de base de datos. Para obtener más información, consulta Conectar a un clúster a través de las Librerías de clientes.

4

Ejecute el siguiente comando para consultar su colección:

node compound-bury-results.js
{"_id":"573a139af29313caabcefcce","plot":"Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.","genres":["Family","Drama","Fantasy"],"title":"The Canterville Ghost","score":5.909613132476807}
{"_id":"573a13d8f29313caabda5dc1","plot":"The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!","genres":["Family","Fantasy"],"title":"The Little Ghost","score":5.367666244506836}
{"_id":"573a13c0f29313caabd6139d","plot":"Renowned \\"ghost hunter\\", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.","genres":["Horror","Thriller"],"title":"Death of a Ghost Hunter","score":4.676314353942871}
{"_id":"573a1398f29313caabcebf6f","plot":"After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.","genres":["Drama","Fantasy","Romance"],"title":"Ghost","score":3.9638845920562744}
{"_id":"573a13cdf29313caabd83c08","plot":"A man tries to solve his lovers murder by communicating with her spirit through the help of a medium.","genres":["Drama","Fantasy","Mystery"],"title":"Ghost","score":3.9638845920562744}
{"_id":"573a13cef29313caabd873a2","plot":"A man tries to solve his lovers murder by communicating with her spirit through the help of a medium.","genres":["Drama","Fantasy","Mystery"],"title":"Ghost","score":3.9638845920562744}
{"_id":"573a13c3f29313caabd6a149","plot":"What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...","genres":["Horror","Thriller"],"title":"Coming Soon","score":3.526711940765381}
{"_id":"573a1397f29313caabce7ea1","plot":"Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderleys twin sons dies in a bizarre accident, the group ...","genres":["Drama","Horror","Thriller"],"title":"Ghost Story","score":3.3177831172943115}
{"_id":"573a13a4f29313caabd117df","plot":"Stunt motorcyclist Johnny Blaze gives up his soul to become a hellblazing vigilante, to fight against power hungry Blackheart, the son of the devil himself.","genres":["Action","Fantasy","Thriller"],"title":"Ghost Rider","score":3.3177831172943115}
{"_id":"573a13a6f29313caabd185dc","plot":"A salvage crew that discovers a long-lost 1962 passenger ship floating lifeless in a remote region of the Bering Sea soon notices, as they prepare to tow it back to land, that \\"strange things\\" happen...","genres":["Horror","Mystery"],"title":"Ghost Ship","score":3.3177831172943115}

Los documentos de películas en los resultados contienen el término de query ghost en el campo plot o title y no pertenecen al género Comedy. MongoDB Search no devolvió documentos del género Comedy con el término ghost en el campo plot o title porque esos documentos no se ubicaron entre los 10 principales, ya que la query redujo la puntuación de esos documentos en un 50%.

node compound-bury-results.js
{"_id":"573a139af29313caabcefcce","plot":"Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.","title":"The Canterville Ghost","score":5.909613132476807}
{"_id":"573a13d8f29313caabda5dc1","plot":"The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!","title":"The Little Ghost","score":5.367666244506836}
{"_id":"573a13c0f29313caabd6139d","plot":"Renowned \\"ghost hunter\\", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.","title":"Death of a Ghost Hunter","score":4.676314353942871}
{"_id":"573a1398f29313caabcebf6f","plot":"After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.","title":"Ghost","score":3.9638845920562744}
{"_id":"573a13c3f29313caabd6a149","plot":"What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...","title":"Coming Soon","score":3.526711940765381}
{"_id":"573a1398f29313caabce912c","plot":"Three unemployed parapsychology professors set up shop as a unique ghost removal service.","title":"Ghostbusters","score":3.5241782665252686}
{"_id":"573a139cf29313caabcf5a48","plot":"Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.","title":"Casper Meets Wendy","score":3.5241782665252686}
{"_id":"573a13bdf29313caabd58274","plot":"Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...","title":"Bhoothnath","score":3.4605300426483154}
{"_id":"573a1397f29313caabce7ea1","plot":"Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderleys twin sons dies in a bizarre accident, the group ...","title":"Ghost Story","score":3.3177831172943115}
{"_id":"573a1398f29313caabcebf79","plot":"Elliot Hopper is a widower with three children, he is currently working on a deal. It seems like his wife illness was very costly and this deal could put them out of the red. However he ...","title":"Ghost Dad","score":3.3177831172943115}

Los documentos de la película en los resultados contienen el término de consulta ghost en el campo plot o title y no tienen los ObjectIds especificados en el campo _id. MongoDB Search no devolvió los documentos con los ObjectsIds especificados, aunque contienen el término de la query ghost en el campo title, porque la query redujo la puntuación de estos documentos en un 50% y, por tanto, estos documentos no se ubicaron en los primeros 10 documentos.

1
2

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en la trama o en el título (cláusula must) y que no sean del género comedy (cláusula mustNot).

  • Busca películas que contengan el término ghost en el argumento o en el título (cláusula must) y que sean del género comedy (cláusula filter), pero que reduzcan el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Incluye solo los campos _id, title, plot y genres de los documentos en los resultados.

  • Añade un campo llamado score que muestra la puntuación en los resultados.

1import pymongo
2import dns
3
4client = pymongo.MongoClient('<connection-string>')
5result = client['sample_mflix']['movies'].aggregate([
6 {
7 '$search': {
8 'index': 'default',
9 'compound': {
10 'should': [
11 {
12 'compound': {
13 'must': [
14 {
15 'text': {
16 'query': 'ghost',
17 'path': [ 'plot', 'title' ]
18 }
19 }
20 ],
21 'mustNot': [
22 {
23 'text': {
24 'query': 'Comedy',
25 'path': [ 'genres' ]
26 }
27 }
28 ]
29 }
30 }, {
31 'compound': {
32 'must': [
33 {
34 'text': {
35 'query': 'ghost',
36 'path': [ 'plot', 'title' ]
37 }
38 }
39 ],
40 'filter': [
41 {
42 'text': {
43 'query': 'Comedy',
44 'path': [ 'genres' ]
45 }
46 }
47 ],
48 'score': { 'boost': { 'value': 0.5 } }
49 }
50 }
51 ]
52 }
53 }
54 }, {
55 '$limit': 10
56 }, {
57 '$project': {
58 '_id': 1,
59 'title': 1,
60 'plot': 1,
61 'genres': 1,
62 'score': { '$meta': 'searchScore' }
63 }
64 }
65])
66
67for i in result:
68 print(i)

Esta query utiliza las siguientes etapas de pipeline:

  • Busca películas que contengan el término ghost en el argumento o el título (cláusula must), pero que no tengan los Objetos Id especificados (cláusula mustNot).

  • Busca películas que contengan el término ghost en la trama o el título (cláusula must) y tengan los ObjectId especificados (cláusula filter), pero reduce el score en un 50% (boost).

Limita el número de resultados a 10 documentos.

  • Solo incluye los campos title, plot y _id de los documentos de los resultados.

  • Agrega un campo llamado score que muestra la puntuación del documento en los resultados.

1import pymongo
2import dns
3from bson import ObjectId
4
5client = pymongo.MongoClient('<connection-string>')
6result = client['sample_mflix']['movies'].aggregate([
7 {
8 '$search': {
9 'index': 'default',
10 'compound': {
11 'should': [
12 {
13 'compound': {
14 'must': [
15 {
16 'text': {
17 'query': 'ghost',
18 'path': [ 'plot', 'title' ]
19 }
20 }
21 ],
22 'mustNot': [
23 {
24 'in': {
25 'value': [ ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2') ],
26 'path': '_id'
27 }
28 }
29 ]
30 }
31 }, {
32 'compound': {
33 'must': [
34 {
35 'text': {
36 'query': 'ghost',
37 'path': [ 'plot', 'title' ]
38 }
39 }
40 ],
41 'filter': [
42 {
43 'in': {
44 'value': [ ObjectId('573a13cdf29313caabd83c08'), ObjectId('573a13cef29313caabd873a2') ],
45 'path': '_id'
46 }
47 }
48 ],
49 'score': { 'boost': { 'value': 0.5 } }
50 }
51 }
52 ]
53 }
54 }
55 }, {
56 '$limit': 10
57 }, {
58 '$project': {
59 '_id': 1,
60 'title': 1,
61 'plot': 1,
62 'score': { '$meta': 'searchScore' }
63 }
64 }
65])
66
67for i in result:
68 print(i)
3

Asegúrate de que la cadena de conexión incluya las credenciales del usuario de base de datos. Para obtener más información, consulta Conectar a un clúster a través de las Librerías de clientes.

4
python compound-bury-results.csproj
{'_id': ObjectId('573a139af29313caabcefcce'), 'plot': 'Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.', 'genres': ['Family', 'Drama', 'Fantasy'], 'title': 'The Canterville Ghost', 'score': 5.909613132476807}
{'_id': ObjectId('573a13d8f29313caabda5dc1'), 'plot': 'The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!', 'genres': ['Family', 'Fantasy'], 'title': 'The Little Ghost', 'score': 5.367666244506836}
{'_id': ObjectId('573a13c0f29313caabd6139d'), 'plot': 'Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.', 'genres': ['Horror', 'Thriller'], 'title': 'Death of a Ghost Hunter', 'score': 4.676314353942871}
{'_id': ObjectId('573a1398f29313caabcebf6f'), 'plot': 'After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.', 'genres': ['Drama', 'Fantasy', 'Romance'], 'title': 'Ghost', 'score': 3.9638845920562744}
{'_id': ObjectId('573a13cdf29313caabd83c08'), 'plot': "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", 'genres': ['Drama', 'Fantasy', 'Mystery'], 'title': 'Ghost', 'score': 3.9638845920562744}
{'_id': ObjectId('573a13cef29313caabd873a2'), 'plot': "A man tries to solve his lover's murder by communicating with her spirit through the help of a medium.", 'genres': ['Drama', 'Fantasy', 'Mystery'], 'title': 'Ghost', 'score': 3.9638845920562744}
{'_id': ObjectId('573a13c3f29313caabd6a149'), 'plot': 'What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...', 'genres': ['Horror', 'Thriller'], 'title': 'Coming Soon', 'score': 3.526711940765381}
{'_id': ObjectId('573a1397f29313caabce7ea1'), 'plot': "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...", 'genres': ['Drama', 'Horror', 'Thriller'], 'title': 'Ghost Story', 'score': 3.3177831172943115}
{'_id': ObjectId('573a13a4f29313caabd117df'), 'plot': 'Stunt motorcyclist Johnny Blaze gives up his soul to become a hellblazing vigilante, to fight against power hungry Blackheart, the son of the devil himself.', 'genres': ['Action', 'Fantasy', 'Thriller'], 'title': 'Ghost Rider', 'score': 3.3177831172943115}
{'_id': ObjectId('573a13a6f29313caabd185dc'), 'plot': 'A salvage crew that discovers a long-lost 1962 passenger ship floating lifeless in a remote region of the Bering Sea soon notices, as they prepare to tow it back to land, that "strange things" happen...', 'genres': ['Horror', 'Mystery'], 'title': 'Ghost Ship', 'score': 3.3177831172943115}

Los documentos de películas en los resultados contienen el término de query ghost en el campo plot o title y no pertenecen al género Comedy. MongoDB Search no devolvió documentos del género Comedy con el término ghost en el campo plot o title porque esos documentos no se ubicaron entre los 10 principales, ya que la query redujo la puntuación de esos documentos en un 50%.

python compound-bury-results.csproj
{'_id': ObjectId('573a139af29313caabcefcce'), 'plot': 'Adaption of the famous Oscar Wilde tale about a young American girl that helps a British ghost find rest and forgiveness.', 'title': 'The Canterville Ghost', 'score': 5.909613132476807}
{'_id': ObjectId('573a13d8f29313caabda5dc1'), 'plot': 'The Little Ghost lives in the castle over looking a small town and awakens for precisely one hour after the clock strikes midnight. Follow him on this adventure to see his first sunrise ever!', 'title': 'The Little Ghost', 'score': 5.367666244506836}
{'_id': ObjectId('573a13c0f29313caabd6139d'), 'plot': 'Renowned "ghost hunter", Carter Simms is paid to conduct a paranormal investigation of a supposedly haunted house. Along with a cameraman, a reporter, and a spiritual advocate, she embarks on a three night journey into terror.', 'title': 'Death of a Ghost Hunter', 'score': 4.676314353942871}
{'_id': ObjectId('573a1398f29313caabcebf6f'), 'plot': 'After an accident leaves a young man dead, his spirit stays behind to warn his lover of impending danger, with the help of a reluctant psychic.', 'title': 'Ghost', 'score': 3.9638845920562744}
{'_id': ObjectId('573a13c3f29313caabd6a149'), 'plot': 'What kind of scenes in a horror film scares you the most? When a ghost appears totally unexpectedly? When the main character does not see the ghost sneaking up behind him? When at the very ...', 'title': 'Coming Soon', 'score': 3.526711940765381}
{'_id': ObjectId('573a1398f29313caabce912c'), 'plot': 'Three unemployed parapsychology professors set up shop as a unique ghost removal service.', 'title': 'Ghostbusters', 'score': 3.5241782665252686}
{'_id': ObjectId('573a139cf29313caabcf5a48'), 'plot': 'Casper, a ghost, teams up with Wendy, a witch, against an evil warlock.', 'title': 'Casper Meets Wendy', 'score': 3.5241782665252686}
{'_id': ObjectId('573a13bdf29313caabd58274'), 'plot': 'Banku, his mother, Anjali Sharma and father move in to their new house -- the Nath villa, unaware of the fact that the house is inhabited by a ghost. It is learnt the ghost is not too happy...', 'title': 'Bhoothnath', 'score': 3.4605300426483154}
{'_id': ObjectId('573a1397f29313caabce7ea1'), 'plot': "Four successful elderly gentlemen, members of the Chowder Society, share a gruesome, 50-year old secret. When one of Edward Wanderley's twin sons dies in a bizarre accident, the group ...", 'title': 'Ghost Story', 'score': 3.3177831172943115}
{'_id': ObjectId('573a1398f29313caabcebf79'), 'plot': 'Elliot Hopper is a widower with three children, he is currently working on a deal. It seems like his wife illness was very costly and this deal could put them out of the red. However he ...', 'title': 'Ghost Dad', 'score': 3.3177831172943115}

Los documentos de la película en los resultados contienen el término de consulta ghost en el campo plot o title y no tienen los ObjectIds especificados en el campo _id. MongoDB Search no devolvió los documentos con los ObjectsIds especificados, aunque contienen el término de la query ghost en el campo title, porque la query redujo la puntuación de estos documentos en un 50% y, por tanto, estos documentos no se ubicaron en los primeros 10 documentos.

Puedes normalizar tu puntuación de query $search en el rango de 0 a 1 en las etapas posteriores de tu pipeline de agregación. Puedes utilizar las siguientes etapas después de tu etapa $search en el siguiente orden para normalizar la puntuación:

  • $addFields
    {
    "$addFields": {
    "score": {
    "$meta": "searchScore"
    }
    }
    }
  • $setWindowFields
    {
    "$setWindowFields": {
    "output": {
    "maxScore": {
    "$max": "$score"
    }
    }
    }
    }
  • $addFields
    {
    "$addFields": {
    "normalizedScore": {
    "$divide": [
    "$score", "$maxScore"
    ]
    }
    }
    }
1db.movies.aggregate([{
2 "$search": {
3 "text": {
4 "query": "Helsinki",
5 "path": "plot"
6 }
7 }
8 },
9 {
10 "$limit": 5
11 },
12 {
13 "$project": {
14 "_id": 0,
15 "title": 1,
16 "score": 1,
17 "maxScore": 1,
18 "normalizedScore": 1
19 }
20 },
21 {
22 "$addFields": {
23 "score": {
24 "$meta": "searchScore"
25 }
26 }
27 },
28 {
29 "$setWindowFields": {
30 "output": {
31 "maxScore": {
32 "$max": "$score"
33 }
34 }
35 }
36 },
37 {
38 "$addFields": {
39 "normalizedScore": {
40 "$divide": [
41 "$score", "$maxScore"
42 ]
43 }
44 }
45}])
1[
2 {
3 title: 'Drifting Clouds',
4 score: 4.5660295486450195,
5 maxScore: 4.5660295486450195,
6 normalizedScore: 1
7 },
8 {
9 title: 'Sairaan kaunis maailma',
10 score: 4.041563034057617,
11 maxScore: 4.5660295486450195,
12 normalizedScore: 0.8851372929150143
13 },
14 {
15 title: 'Bad Luck Love',
16 score: 3.6251673698425293,
17 maxScore: 4.5660295486450195,
18 normalizedScore: 0.79394303764817
19 },
20 {
21 title: 'Bad Luck Love',
22 score: 3.6251673698425293,
23 maxScore: 4.5660295486450195,
24 normalizedScore: 0.79394303764817
25 },
26 {
27 title: 'Forbidden Fruit',
28 score: 3.6251673698425293,
29 maxScore: 4.5660295486450195,
30 normalizedScore: 0.79394303764817
31 }
32]
1db.movies.aggregate([{
2 "$search": {
3 "text": {
4 "path": "title",
5 "query": "men",
6 "score": {
7 "function":{
8 "multiply":[
9 {
10 "path": {
11 "value": "imdb.rating",
12 "undefined": 2
13 }
14 },
15 {
16 "score": "relevance"
17 }
18 ]
19 }
20 }
21 }
22 }
23 },
24 {
25 "$limit": 5
26 },
27 {
28 "$addFields": {
29 "score": {
30 "$meta": "searchScore"
31 }
32 }
33 },
34 {
35 "$setWindowFields": {
36 "output": {
37 "maxScore": {
38 "$max": "$score"
39 }
40 }
41 }
42 },
43 {
44 "$addFields": {
45 "normalizedScore": {
46 "$divide": [
47 "$score", "$maxScore"
48 ]
49 }
50 }
51 },
52 {
53 "$project": {
54 "_id": 0,
55 "title": 1,
56 "score": 1,
57 "maxScore": 1,
58 "normalizedScore": 1
59 }
60}])
1[
2 {
3 title: 'Men...',
4 score: 23.431293487548828,
5 maxScore: 23.431293487548828,
6 normalizedScore: 1
7 },
8 {
9 title: '12 Angry Men',
10 score: 22.080968856811523,
11 maxScore: 23.431293487548828,
12 normalizedScore: 0.9423708882544255
13 },
14 {
15 title: 'X-Men',
16 score: 21.34803581237793,
17 maxScore: 23.431293487548828,
18 normalizedScore: 0.911090795039637
19 },
20 {
21 title: 'X-Men',
22 score: 21.34803581237793,
23 maxScore: 23.431293487548828,
24 normalizedScore: 0.911090795039637
25 },
26 {
27 title: 'Matchstick Men',
28 score: 21.05954933166504,
29 maxScore: 23.431293487548828,
30 normalizedScore: 0.8987787781692841
31 }
32]
1db.movies.aggregate([{
2 "$search": {
3 "text": {
4 "path": "title",
5 "query": "shop",
6 "score": {
7 "function":{
8 "gauss": {
9 "path": {
10 "value": "imdb.rating",
11 "undefined": 4.6
12 },
13 "origin": 9.5,
14 "scale": 5,
15 "offset": 0,
16 "decay": 0.5
17 }
18 }
19 }
20 }
21 }
22 },
23 {
24 "$limit": 5
25 },
26 {
27 "$addFields": {
28 "score": {
29 "$meta": "searchScore"
30 }
31 }
32 },
33 {
34 "$setWindowFields": {
35 "output": {
36 "maxScore": {
37 "$max": "$score"
38 }
39 }
40 }
41 },
42 {
43 "$addFields": {
44 "normalizedScore": {
45 "$divide": [
46 "$score", "$maxScore"
47 ]
48 }
49 }
50 },
51 {
52 "$project": {
53 "_id": 0,
54 "title": 1,
55 "score": 1,
56 "maxScore": 1,
57 "normalizedScore": 1
58 }
59}])
1[
2 {
3 title: 'The Shop Around the Corner',
4 score: 0.9471074342727661,
5 maxScore: 0.9471074342727661,
6 normalizedScore: 1
7 },
8 {
9 title: 'Exit Through the Gift Shop',
10 score: 0.9471074342727661,
11 maxScore: 0.9471074342727661,
12 normalizedScore: 1
13 },
14 {
15 title: 'The Shop on Main Street',
16 score: 0.9395227432250977,
17 maxScore: 0.9471074342727661,
18 normalizedScore: 0.9919917310611205
19 },
20 {
21 title: 'Chop Shop',
22 score: 0.8849083781242371,
23 maxScore: 0.9471074342727661,
24 normalizedScore: 0.9343273488331464
25 },
26 {
27 title: 'Little Shop of Horrors',
28 score: 0.8290896415710449,
29 maxScore: 0.9471074342727661,
30 normalizedScore: 0.8753913353110349
31 }
32]
1db.movies.aggregate([{
2 "$search": {
3 "text": {
4 "path": "title",
5 "query": "men",
6 "score": {
7 "function":{
8 "path": {
9 "value": "imdb.rating",
10 "undefined": 4.6
11 }
12 }
13 }
14 }
15 }
16 },
17 {
18 "$limit": 5
19 },
20 {
21 "$addFields": {
22 "score": {
23 "$meta": "searchScore"
24 }
25 }
26 },
27 {
28 "$setWindowFields": {
29 "output": {
30 "maxScore": {
31 "$max": "$score"
32 }
33 }
34 }
35 },
36 {
37 "$addFields": {
38 "normalizedScore": {
39 "$divide": [
40 "$score", "$maxScore"
41 ]
42 }
43 }
44 },
45 {
46 "$project": {
47 "_id": 0,
48 "title": 1,
49 "score": 1,
50 "maxScore": 1,
51 "normalizedScore": 1
52 }
53}])
1[
2 {
3 title: '12 Angry Men',
4 score: 8.899999618530273,
5 maxScore: 8.899999618530273,
6 normalizedScore: 1
7 },
8 {
9 title: 'The Men Who Built America',
10 score: 8.600000381469727,
11 maxScore: 8.899999618530273,
12 normalizedScore: 0.9662922191102197
13 },
14 {
15 title: 'No Country for Old Men',
16 score: 8.100000381469727,
17 maxScore: 8.899999618530273,
18 normalizedScore: 0.9101124414213563
19 },
20 {
21 title: 'X-Men: Days of Future Past',
22 score: 8.100000381469727,
23 maxScore: 8.899999618530273,
24 normalizedScore: 0.9101124414213563
25 },
26 {
27 title: 'The Best of Men',
28 score: 8.100000381469727,
29 maxScore: 8.899999618530273,
30 normalizedScore: 0.9101124414213563
31 }
32]
1db.movies.aggregate([{
2 "$search": {
3 "text": {
4 "path": "title",
5 "query": "men",
6 "score": {
7 "function": {
8 "log": {
9 "path": {
10 "value": "imdb.rating",
11 "undefined": 10
12 }
13 }
14 }
15 }
16 }
17 }
18 },
19 {
20 "$limit": 5
21 },
22 {
23 "$addFields": {
24 "score": {
25 "$meta": "searchScore"
26 }
27 }
28 },
29 {
30 "$setWindowFields": {
31 "output": {
32 "maxScore": {
33 "$max": "$score"
34 }
35 }
36 }
37 },
38 {
39 "$addFields": {
40 "normalizedScore": {
41 "$divide": [
42 "$score", "$maxScore"
43 ]
44 }
45 }
46 },
47 {
48 "$project": {
49 "_id": 0,
50 "title": 1,
51 "score": 1,
52 "maxScore": 1,
53 "normalizedScore": 1
54 }
55 }
56])
1[
2 {
3 title: '12 Angry Men',
4 score: 0.9493899941444397,
5 maxScore: 0.9493899941444397,
6 normalizedScore: 1
7 },
8 {
9 title: 'The Men Who Built America',
10 score: 0.9344984292984009,
11 maxScore: 0.9493899941444397,
12 normalizedScore: 0.9843145968064908
13 },
14 {
15 title: 'No Country for Old Men',
16 score: 0.9084849953651428,
17 maxScore: 0.9493899941444397,
18 normalizedScore: 0.9569144408182233
19 },
20 {
21 title: 'X-Men: Days of Future Past',
22 score: 0.9084849953651428,
23 maxScore: 0.9493899941444397,
24 normalizedScore: 0.9569144408182233
25 },
26 {
27 title: 'The Best of Men',
28 score: 0.9084849953651428,
29 maxScore: 0.9493899941444397,
30 normalizedScore: 0.9569144408182233
31 }
32]

Los resultados de la búsqueda en MongoDB Search incluyen las siguientes puntuaciones:

  • La puntuación modificada para la query $search en el campo score de la etapa $addFields.

  • La puntuación máxima asignada a los documentos en los resultados en el campo maxScore de la etapa $setWindowFields.

  • La puntuación normalizada en el campo normalizedScore de la etapa $addFields, que se calcula dividiendo la puntuación modificada en $score por la puntuación máxima en $maxScore usando $divide.

Para aprender más sobre consultas compuestas usando MongoDB Search, haz la Unidad 9 del Curso Intro A MongoDB en MongoDB University. La unidad de 1.5 horas incluye una descripción general de MongoDB Search y lecciones sobre la creación de índices de MongoDB Search, la ejecución de $search consultas utilizando operadores compuestos y la agrupación de resultados utilizando facet (operador de búsqueda de MongoDB).