首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过名为"fecha_proximo_mantenimiento“(next_date_maintenance)的字符串类型字段从集合中过滤文档?

如何通过名为"fecha_proximo_mantenimiento“(next_date_maintenance)的字符串类型字段从集合中过滤文档?
EN

Stack Overflow用户
提问于 2021-08-26 16:59:31
回答 2查看 56关注 0票数 2

我有一个名为"inventory_devices“的集合,我需要从这个集合中获得接近维护的文档(通常是下一个维护日期前30天),目前我正试图过滤日期前30天在"date_close_to_maintenance”字段中的文档,但我找不到方法。"maintenance_next_date“为字符串类型。我目前在NodeJS中使用Mongoose库进行MongoDB查询。

变量/字段"contract“是文档的公共标识符,它是我对文档进行分组的工具。每X个文档都有一个关联的合同,类似于customer表的"Customer类型“。

该模型具有以下内容,我将显示仅因为模型可能包含300行而使用的数据:

代码语言:javascript
复制
const mongoose = require('mongoose')
    
    const Schema = mongoose.Schema
    const InventarioDispositivosSchema = new mongoose.Schema({
        contrato: {
            type: Schema.Types.ObjectId,
                ref: 'Contrato'
            },
      informacion_equipo: {
            type: Object,
            require: ["sistema_operativo", "ip", "nombre_equipo", "usuario_red"],
            properties: {
      ususario_red: { //Este campo y el modelo en sí funciona como está
                    type: String,
                    required: false,
                    trim: true,
                },
        },
    },fecha_proximo_mantenimiento: {
        type: String,
        required: false,
        trim: true,
    }, { collection: 'inventario_dispositivos', timestamps: true })

const InventarioDispositivos = mongoose.model('InventarioDispositivos', InventarioDispositivosSchema)

module.exports = InventarioDispositivos

我有以下疑问:

代码语言:javascript
复制
// With "contrato" burned

let contrato = 'contrato1';

 Dispositivos.find(
  {
    //Filtros que se le hacen a la consulta 
    contrato,
    fecha_proximo_mantenimiento: {   
      $exists: true
    }
  },
  {
    //Datos que quiero que se muestren, solo el ID se oculta.
    _id: 0,
    'informacion_equipo.ususario_red': 1,
    fecha_proximo_mantenimiento: 1
  }
).limit(10).then((devices) => {
  console.log(devices)
}).catch(err => {
  console.log(err)
})

显示的模型示例以及上面的查询返回的内容:

代码语言:javascript
复制
 {
    informacion_equipo: { ususario_red: 'angel.goez' },
    fecha_proximo_mantenimiento: '2021-08-30'
  },
  {
    informacion_equipo: { ususario_red: 'angel.goez' },
    fecha_proximo_mantenimiento: '2021-08-25'
  }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-26 17:59:53

希望我没弄错你的问题。

下面的查询将过滤fecha_proximo_mantenimiento值大于30天的文档。

代码语言:javascript
复制
[
  {
    "$addFields": {
      "fecha_proximo_mantenimiento_timestamp": {
        "$subtract": [
          "$$NOW",
          {
            "$toDate": "$fecha_proximo_mantenimiento"
          }
        ]
      }
    }
  },
  {
    "$match": {
      "fecha_proximo_mantenimiento_timestamp": {
        "$gte": 1000 * 60 * 60 * 24 * 30
      }
    }
  }
]

First stage Date添加新字段(我使用附加的_timestamp将其称为与原始字段相同),并从$addFields中减去字段值(也会转换为Date,因为您的模式将其定义为字符串)。

第二阶段$match检查减去的结果(以毫秒为单位)是否大于30天(如果对您来说更容易,也可以用2592000000替换)。

票数 1
EN

Stack Overflow用户

发布于 2021-08-27 14:52:40

代码语言:javascript
复制
const hasta = moment(new Date()).add(30, 'days').format('YYYY-MM-DD');

const desde = moment(new Date()).format('YYYY-MM-DD');

const contrato= 0;

Dispositivos.find(
  contrato,
  fecha_proximo_mantenimiento: { 
    $exists: true 
  }
},
  {
    _id: 0,
    'informacion_equipo.ususario_red': 1,
    fecha_proximo_mantenimiento: 1
  })
  .where('fecha_proximo_mantenimiento')
  .gte(desde)
  .lte(hasta)
  .exec(function (err, result) {
    if (err) {
      console.log(err)
    } else {
      for (var x in result) {
        console.log('numero de documento: ', x, result[x])
      }
    }
  });

它也适用于find

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68942655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档