Tengo el siguiente documento de Mongo:

{
    "_id" : ObjectId("5ea0576c2671f799e1ad65db"),
    "model" : "Volkswagen",
    "make" : "Volkswagen",
    "year" : 1969,
    "mileage" : 15000.0,
    "vi_number" : "ba37d9b98fe940dba100fdf0330c30f0",
    "engine" : {
        "horsepower" : 400,
        "liters" : 5.0,
        "mpg" : 20.0,
        "serial_number" : "a9ff4120-ee34-4588-af1a-77f62457531f"
    },
    "service_history" : [ 
        {
            "date" : ISODate("2020-04-22T12:10:55.622Z"),
            "description" : "Cleaning",
            "price" : 150.0,
            "customer_rating" : 5
        }, 
        {
            "date" : ISODate("2020-04-22T12:14:53.439Z"),
            "description" : "Flat tire",
            "price" : 100.0,
            "customer_rating" : 2
        }, 
        {
            "date" : ISODate("2020-04-22T12:30:54.071Z"),
            "description" : "Waxing",
            "price" : 77.0,
            "customer_rating" : 4
        }
    ]
}

Creé la siguiente consulta en Python y devuelve todos los subdocumentos:

cars = Car.objects().filter(service_history__customer_rating__lte=2)

Cuando ejecuto la siguiente consulta directamente en Mongo:

db.getCollection('cars').find({'service_history.customer_rating': {$lte: 2}})

Devuelve nuevamente todos los subdocumentos en lugar de solo uno.

Revisé la documentación y todo parece correcto.

0
acuencadev 22 abr. 2020 a las 20:09

2 respuestas

db.getCollection('cars').find({'service_history.customer_rating': {$lte: 2}})

Editar:

Lo que sucede aquí es que comprueba la calificación del cliente y, dado que encuentra una coincidencia, devuelve el documento. Todo lo que se devuelve es el documento.

PD: Perdón por la confusión anterior.

3
Shehan 22 abr. 2020 a las 18:05

Mira la siguiente consulta. Espero que esto te ayudará. Debe utilizar las agregaciones MongoDB para encontrar el operador $lte.

db.collection.aggregate([
  {
    $unwind: "$service_history"
  },
  {
    $match: {
      "_id": ObjectId("5ea0576c2671f799e1ad65db")
    }
  },
  {
    $match: {
      $expr: {
        $lte: [
          "$service_history.customer_rating",
          2
        ]
      }
    }
  }
])

Estos serían los datos de muestra que obtendría si utilizara la consulta anterior.

[
  {
    "_id": ObjectId("5ea0576c2671f799e1ad65db"),
    "engine": {
      "horsepower": 400,
      "liters": 5,
      "mpg": 20,
      "serial_number": "a9ff4120-ee34-4588-af1a-77f62457531f"
    },
    "make": "Volkswagen",
    "mileage": 15000,
    "model": "Volkswagen",
    "service_history": {
      "customer_rating": 2,
      "date": ISODate("2020-04-22T12:14:53.439Z"),
      "description": "Flat tire",
      "price": 100
    },
    "vi_number": "ba37d9b98fe940dba100fdf0330c30f0",
    "year": 1969
  }
]

Puedes referirte a este código.

0
Aravind 22 abr. 2020 a las 18:32