【问题标题】:Problem with the relationship in express/mongoose快递/猫鼬中的关系问题
【发布时间】:2020-10-23 03:09:15
【问题描述】:

我正在创建一个名为“销售”的文档,每个销售都有属性,例如日期、名称、总计、创建它的用户的 ID 等。我还有另一个名为“Sell_details”的文档,我在其中存储每个销售的详细信息及其销售 _id。那么我如何检索我在数据库中的所有销售以及该销售所具有的一系列详细信息?我试过这样做,但它没有检索到所有细节和其他问题。这就是我所拥有的。

这是销售模式

const mongoose = require('mongoose');
const validator = require('validator');
const uniqueValidator = require('mongoose-unique-validator');
 
const ventaSchema = new mongoose.Schema({
    usuarioId: {
        type: mongoose.Schema.Types.ObjectId,
        required: true
    },
    clienteId: {
        type: mongoose.Schema.Types.ObjectId,
        required: true
    },
    tipo_comprobante: {
        type: String,
        required: true
    },
    num_comprobante: {
        type: Number,
        required: true
    },
    serie_comprobante: {
        type: Number,
        required: true
    },
    fecha: {
        type: Date,
        default: Date.now()
    },
    impuesto: {
        type: Number,
        required: true
    },
    total: {
        type: Number,
        required: true
    },
    estado: {
        type: String,
        default: 'Activo'
    },
    owner: {
        type: mongoose.Schema.Types.ObjectId,
        required: true,
        ref: 'User'
    },
    ventas: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Detalle_Venta'
    },
    detalles: {
        type: Array
    }
},{ toJSON: { virtuals: true } });
 

ventaSchema.plugin(uniqueValidator, { message: 'Expected {PATH} to be unique' });

const Venta = mongoose.model('Venta', ventaSchema);

module.exports = 文塔;

他是销售路由器:

router.get('/ventas', auth, async(req, res) => {
    try {
        await req.user.populate({
            path: 'ventas',
            options: {
                limit: req.query.limit
            }
        }).execPopulate();
 
        req.user.ventas.forEach(element => {
            const detalles = Detalle_Venta.find({ventaId: element._id});
            detalles.then(el => {
                el.forEach(detalle => {
                    if (element.detalles.length > 1) {
                        element.detalles.forEach(el => {
                            const isAdded = el._id === detalle._id;
                            if (isAdded) {
                                element.detalles.push(detalle);
                            }
                        })
                    } else {
                        element.detalles.push(detalle);
                    }
                });
                });
                element.save();
        });
        res.send(req.user.ventas);
    } catch (error) {
        res.status(400).send(error);
    }
 
});

这是邮递员的输出:

[
    {
        "fecha": "2020-06-22T18:16:44.175Z",
        "estado": "Activo",
        "detalles": [
            {
                "_id": "5ef0fa4e49de0641c46eca0b",
                "idArticulo": "5ee825bfb3da101df49822ae",
                "cantidad": 30,
                "precio": 2,
                "descuento": 0,
                "ventaId": "5ef0fa4e49de0641c46eca0a",
                "__v": 0
            },
            {
                "_id": "5ef0fa4e49de0641c46eca0b",
                "idArticulo": "5ee825bfb3da101df49822ae",
                "cantidad": 30,
                "precio": 2,
                "descuento": 0,
                "ventaId": "5ef0fa4e49de0641c46eca0a",
                "__v": 0
            }
        ],
        "_id": "5ef0fa4e49de0641c46eca0a",
        "usuarioId": "5ee3b6b50376d7143c476834",
        "clienteId": "5ee6b115e43839274cc50ddb",
        "tipo_comprobante": "RNC",
        "num_comprobante": 1000000,
        "serie_comprobante": 20001,
        "impuesto": 18,
        "total": 10500,
        "owner": "5ef0e64083f8c815cc67cd7c",
        "__v": 2,
        "id": "5ef0fa4e49de0641c46eca0a"
    },
    {
        "fecha": "2020-06-22T18:16:44.175Z",
        "estado": "Activo",
        "detalles": [
            {
                "_id": "5ef0fa5a49de0641c46eca0d",
                "idArticulo": "5ee825bfb3da101df49822ae",
                "cantidad": 30,
                "precio": 2,
                "descuento": 0,
                "ventaId": "5ef0fa5a49de0641c46eca0c",
                "__v": 0
            },
            {
                "_id": "5ef0fa5a49de0641c46eca0e",
                "idArticulo": "5ee825bfb3da101df49822ae",
                "cantidad": 303,
                "precio": 2,
                "descuento": 0,
                "ventaId": "5ef0fa5a49de0641c46eca0c",
                "__v": 0
            }
        ],
        "_id": "5ef0fa5a49de0641c46eca0c",
        "usuarioId": "5ee3b6b50376d7143c476834",
        "clienteId": "5ee6b115e43839274cc50ddb",
        "tipo_comprobante": "RNC",
        "num_comprobante": 1000000,
        "serie_comprobante": 20001,
        "impuesto": 18,
        "total": 10500,
        "owner": "5ef0e64083f8c815cc67cd7c",
        "__v": 1,
        "id": "5ef0fa5a49de0641c46eca0c"
    }
]

在你说我这样做之前,“detalles”数组的第一个数组(存储该销售的销售详细信息),我添加了一个销售详细信息,我得到了两个,另一个销售的第二个数组,我得到两个销售细节,但我加了 3,如果我加 4,我只得到 2,我不知道为什么。有没有办法修复它以及另一种最好的方法?

【问题讨论】:

  • 这是重复的

标签: node.js mongoose


【解决方案1】:

mongoose 有一个强大的聚合运算符,称为 populate,您已经使用过它。 您应该将类​​型 ObjectId 用于房产销售详情。

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const personSchema = Schema({
  _id: Schema.Types.ObjectId,
  name: String,
  age: Number,
  stories: [{ type: Schema.Types.ObjectId, ref: 'Story' }]
});

const storySchema = Schema({
  author: { type: Schema.Types.ObjectId, ref: 'Person' },
  title: String,
  fans: [{ type: Schema.Types.ObjectId, ref: 'Person' }]
});

然后您创建将它们联系起来的作者和故事

 const author = new Person({
   _id: new mongoose.Types.ObjectId(),
   name: 'Ian Fleming',
   age: 50
 });

author.save(function (err) {
  if (err) return handleError(err);



 const story1 = new Story({
    title: 'Casino Royale',
    author: author._id    // assign the _id from the person
  });



story1.save(function (err) {
    if (err) return handleError(err);
    // that's it!
    });
});

之后您可以填充

Story.
findOne({ title: 'Casino Royale' }).
  populate('author').
  exec(function (err, story) {
    if (err) return handleError(err);
    console.log('The author is %s', story.author.name);
    // prints "The author is Ian Fleming"
});

这将确保您不会两次获得条目..

【讨论】:

    猜你喜欢
    • 2021-04-12
    • 2021-04-11
    • 1970-01-01
    • 2019-11-24
    • 2014-06-15
    • 2011-08-28
    • 1970-01-01
    • 2023-03-19
    • 2017-03-31
    相关资源
    最近更新 更多