猫鼬填充

时间:2017-12-29 14:05:10

标签: node.js mongodb mongoose where populate

我有两种型号 - M1和M2。

在M1中,我有一组M2对象。

我试图创建一个可以获取一堆M1模型的查询,但只有当M2中的某个字段符合我设置的标准时才会这样。

我已正确设置模型(因此M1有一个针对M2的Schema.Types.ObjectId数组)。

理想情况下,我想做这样的事情:

    var result = await M1.find({
        'm2.title': 'title-match',
        // ...
        // Plus other criteria
    })
    .populate('m2')
    .exec();

所以我想要的是所有具有M2型号的M1型号都具有标题'设置为' title-match'。

但这似乎不起作用,我不知道为什么。

我尝试过使用'匹配'在填充函数中,但这并不适合我设置的其他查找条件(例如,我可以在填充函数中包含匹配但是如果我有一个M1模型具有正确的M2模型但它没有&#39 ; t符合其他标准,然后被遗漏)。

我需要将所有填充过滤与其他过滤器混合在一起,以便正确评估是否应将其包含在结果中。

2 个答案:

答案 0 :(得分:0)

事实证明,这是不可能的。有关此https://github.com/Automattic/mongoose/issues/4043

的更多信息

答案 1 :(得分:0)

我认为没有任何方法可以做您想做的事情。您的问题中的代码示例未按预期工作,因为M1不了解const results = await M1.find({ // ... m1 criteria }).populate('m2').exec() 。 M1仅知道其M2 ObjectId数组。

您将需要查询所有符合M1标准的M1文档并填充M2:

const finalResults = results.filter(({ m2 }) => m2.title === 'title-match')

然后过滤掉所有与您的m2标题匹配的结果:

{{1}}