我有一个名为"inventory_devices“的集合,我需要从这个集合中获得接近维护的文档(通常是下一个维护日期前30天),目前我正试图过滤日期前30天在"date_close_to_maintenance”字段中的文档,但我找不到方法。"maintenance_next_date“为字符串类型。我目前在NodeJS中使用Mongoose库进行MongoDB查询。
变量/字段"contract“是文档的公共标识符,它是我对文档进行分组的工具。每X个文档都有一个关联的合同,类似于customer表的"Customer类型“。
该模型具有以下内容,我将显示仅因为模型可能包含300行而使用的数据:
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我有以下疑问:
// 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)
})显示的模型示例以及上面的查询返回的内容:
{
informacion_equipo: { ususario_red: 'angel.goez' },
fecha_proximo_mantenimiento: '2021-08-30'
},
{
informacion_equipo: { ususario_red: 'angel.goez' },
fecha_proximo_mantenimiento: '2021-08-25'
}发布于 2021-08-26 17:59:53
希望我没弄错你的问题。
下面的查询将过滤fecha_proximo_mantenimiento值大于30天的文档。
[
{
"$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替换)。
发布于 2021-08-27 14:52:40
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
https://stackoverflow.com/questions/68942655
复制相似问题