如果字段不是空字符串,则如何填充,如果为空则无需填充?

3

我有一个应用程序,其中有大量数据以前保存在mongoDB中。现在如果referencePeople不为空字符串,我需要填充一些信息。在我的应用程序中,referencePeople是一个字符串类型,而不是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之前检查它是否为空吗?


1
可能是[Mongoose:Cast to ObjectId failed for value]的重复问题(https://dev59.com/K2Uo5IYBdhLWcg3wxB7T)。 - chridam
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Shaishab Roy
2个回答

1

是的,你需要使用人口查询匹配(match)子句。

因此,你的代码应该类似于这样:

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);
    });

};


嗨 @aeryaguzov,“match”:{“referencePeople”:{“$ne”:“”}}可以在order集合或customer集合中检查吗?我需要在order集合中检查。谢谢。 - Shaishab Roy
在客户集合中。然后尝试在模式中使用正确的引用,例如{referencePeople: {type: String, ref: 'Customer'}}。如果可以,请告诉我,我会更新我的答案。 - aeryaguzov

0
Mongoose目前无法处理多级联,而填充字段不是文档。嵌套模式很有帮助,但这只是一个不完整的解决方案。请根据您的模式设计进行设计。
您正在尝试使用第二个填充调用中现有的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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接