查找在数组中至少有一个项目且没有数组以外的项目

时间:2017-02-14 19:08:41

标签: mongodb mongodb-query aggregation-framework

我正在尝试制作一个复杂的mongo查询,经过数小时的试用,只有错误,我来这里寻求帮助。

提供以下文件:

{
    // Item 1
    name: 'Tranças Nordestinas',
    author: 'Daiane Rosa',
    ingredients: [
        'wheatFlour',
        'sugar',
        'butter',
        'bakingPowder',
        'eggs'
    ]
}

{
    // Item 2
    name: 'Brigadeiro de Churros',
    author: 'Cristine Russel',
    ingredients: [
        'sugar',
        'chocolate'
    ]
}

{
    // Item 3
    name: 'Chá Mate Gelado',
    author: 'Victor Onofre',
    ingredients: [
        'sugar',
        'water'
    ]
}

{
    // Item 4
    name: 'Macarrão Verde ao Molho',
    author: 'Victor Onofre',
    ingredients: [
        'greenPasta',
        'tomatoSauce',
        'butter'
    ]
}

如果我查询数组['sugar','water'],则只返回第三项。

如果我查询数组['water','chocolate','wheatFlour','sugar','butter','bakingPowder','eggs'],则应退回第1,2和3项。

如果我查询数组['sugar'],则不应返回任何项目。

无法找到执行此类查询的方法。 不知道mongodb是否是正确的选择,在这种情况下mysql会表现得更好吗?

感谢。

1 个答案:

答案 0 :(得分:1)

您可以尝试$redact $setIsSubset来查询。

$setSubset将成分数组与输入数组进行比较,并在成分数组是输入数组的子集时返回true,其中包含等于,而$redact将使用来自以上比较;要保留的true值和false值才能删除文档。

db.collection.aggregate(
    [{
        $redact: {
            $cond: {
                if: {
                    $setIsSubset: ["$ingredients", ['sugar']]
                },
                then: "$$KEEP",
                else: "$$PRUNE"
            }
        }
    }]
);