【问题标题】:Mongoose - How to find by an 'array' of ObjectId?Mongoose - 如何通过 ObjectId 的“数组”查找?
【发布时间】:2019-04-12 12:22:51
【问题描述】:

我从一个查询中得到一个 ObjectId 数组,然后我需要在另一个查询中使用它们。

函数如下:

exports.getAllByShop = wrap(async(req, res, next) => {
    const products = await Product.find({ _shop: mongoose.Types.ObjectId(req.params.shopId) }).select('_id');
    // how to make this query?
    const sales = await Sale.find({ _product: { $in: [ products ]}});
    res.status(200).json(sales);
});

第一个查询products的结果如下:

[ 
  { _id: 5be3601f90e40b35547ae6b4 },
  { _id: 5be4b5a3443abf196cb4cc9a }
]

我想要达到的目标:

const sales = await Sale.find({ _product: { 
$in: 
  [ 
    mongoose.Types.ObjectId(prod1),
    mongoose.Types.ObjectId(prod2),
    ... 
  ]
}});

我需要找到所有sales_product 等于上述数组的值。现在它不起作用并显示此消息:"Cast to ObjectId failed for value "[ { _id: 5be3601f90e40b35547ae6b4 },↵ { _id: 5be4b5a3443abf196cb4cc9a } ]" at path "_product" for model "sale""。如何使最后一个查询起作用?

【问题讨论】:

    标签: node.js database mongodb express mongoose


    【解决方案1】:

    你将一个数组插入到一个数组中,试试这个

    const productIds = products.map((v) => v)
    const sales = await Sale.find({ _product: { $in: productIds }});
    

    【讨论】:

    • 数组的结果仍然相同。如何将[ { _id: xxx }, { _id: yyy } ] 转换为[ mongoose.Types.ObjectId(xxx), mongoose.Types.ObjectId(yyy) ]
    • mongoose 应该知道基于模式的类型,因此您不需要强制转换它们。但如果您想尝试将它们添加到地图中,例如 products.map((v) => mongoose.Types.ObjectId(v))
    • 你是对的。去掉多余的[ ]
    • 最后一个问题..._product 在架构中以这种方式声明:_product: { type: mongoose.Schema.Types.ObjectId, required: true, ref: 'product' }。我可以像这样使用populate 来恢复refconst sales = await Sale.find({ _product: { $in: productIds }}).populate('product'); 吗?
    • 本来是要提到填充的,是的,你可以使用populate('_product'),mongo 也会返回这些文件。 populate() 采用字段名称而不是模型名称
    猜你喜欢
    • 2017-04-20
    • 2013-02-06
    • 2013-02-06
    • 2016-06-13
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2015-05-02
    • 2017-11-22
    相关资源
    最近更新 更多