【问题标题】:How to populate if field is not empty string if empty no need to populate?如果字段不是空字符串,如果不需要填充,如何填充?
【发布时间】:2016-02-25 12:14:08
【问题描述】:

我有一个应用程序,该应用程序具有以前保存在 mongoDB 中的大量数据。现在,如果 referencePeople 不是空字符串,我需要填充一些信息。在我的应用中 referencePeoplestring 类型而不是 mongoose ObjectId 类型。

我不想更改我的架构。有没有办法在填充之前检查 referencePeople 是否为空。或者如果为空,请避免填充。

架构:

var OrderSchema = new mongoose.Schema({

    customer: {type: mongoose.Schema.Types.ObjectId,ref: 'Customer'},
    referencePeople: String, // can be "" or "customer id"
   ......
});

尝试了下面的代码,但出现异常在路径“_id”处为值“”转换为 ObjectId 失败

exports.getOrders = function(req, res) {
    Order.find({})
        .populate('customer')
        .populate({path: 'referencePeople', model: 'customer'})
        .exec(function(error, orders) {
            if(error) {
                return res.status(400).send({msg: 'Error occurred while getting orders.', error: error});
            }
            return res.status(200).send(orders);
        });
};

现在我想填充 referencePeople 如果它不是空字符串。 我可以在填充 referencePeople 之前检查是否为空吗?

【问题讨论】:

  • 更新了我的问题。我知道尝试将空字符串转换为对象时出现转换错误。但我的问题是如果它是空字符串,我该如何处理。可能不是重复的问题。谢谢

标签: javascript angularjs node.js mongodb


【解决方案1】:

是的,你需要使用population queryma​​tch子句

所以,你的代码应该是这样的:

exports.getOrders = function(req, res) {
  Order.find({})
    .populate('customer')
    .populate({
       'path': 'referencePeople',
       'match': { 'referencePeople': {'$ne': ''} }
     })
    .exec(function(error, orders) {
        if(error) {
            return res.status(400).send({msg: 'Error occurred while getting orders.', error: error});
        }
        return res.status(200).send(orders);
    });

};

【讨论】:

  • hi @aeryaguzov, 'match': { 'referencePeople': {'$ne': ''} } 可以签入order集合或customer i> 收藏?我需要签入 order 集合。谢谢
  • 在客户收藏中。然后尝试在架构中使用正确的 ref,例如。 {referencePeople:{type:String,ref:'Customer'}。告诉我它是否有效,我会更新我的答案。
【解决方案2】:

Mongoose 还不能处理多级填充,填充的字段不是文档。嵌套模式很有帮助,但它是 不完整的解决方案。相应地设计您的架构。

您正在尝试使用 2nd 填充调用中的现有 ObjectID 引用“referencePeople”对象

试试这个

exports.getOrders = function(req, res) {
Order.find({})
    .populate('customer')
    .exec(function(error, orders) {
        if(error) {
            return res.status(400).send({msg: 'Error occurred while getting orders.', error: error});
        }
        //Try changing the referencePeople here
        return res.status(200).send(orders);
    });

};

参考MongoDB

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2015-11-04
    • 2019-06-05
    • 2014-07-12
    • 1970-01-01
    • 2011-12-23
    • 2012-01-22
    相关资源
    最近更新 更多