$ lookup search Mongodb

时间:2016-11-15 15:39:54

标签: javascript mongodb mongoose mean-stack

目的

使用MongoDB中的引用进行有效搜索。

背景

我在Mongo上有一个Smoothie DB。 smoothie是一个引用Food对象的对象,它表示为:

{
    name: "Red Velvet Cake",
    ingredients: [{
        food_id: "strawberry_raw",
        //other really cool fields
    },
    //other ingredients
    ],
    preparation: "Mix everything and have fun!",
    Source: "Super Smoothies, p. 142"
}

现在,Food对象由以下示例表示:

{
    "_id": "strawberry_raw",
    "name": "strawberries",
    //other really cool fields
}

问题

考虑到这些模式,我确保Smoothie对象知道构建它的所有Food对象。由于每个Smoothie对象最多有6或7个食物对象,我相信这是最好的选择,因为它遵循MongoDB's Principle of least Cardinality

但是,现在我想允许以下功能:

  1. 给出一份成分名称清单,返回所有含有至少一种成分的冰沙
  2. 鉴于成分名称列表,仅返回包含所有这些成分的冰沙。
  3. 我不知道如何使用MongdoDB。

    实施例

    以下示例说明了我想要的内容。

    想象一下,我有以下食物:

    let foods = [{
            "_id": "strawberry_raw",
            "name": "strawberries"
        }, {
            "_id": "honeydew_melon_raw",
            "name": "honeydew melon"
        }, {
            "_id": "coconut_milk",
            "name": "homemade coconut milk"
        }];
    

    以下的冰沙:

    let smoothies = [
    {
        name: "Coco Berry",
        ingredients: [
            { food_id: "strawberry_raw" }, 
            { food_id: "coconut_milk"}
        ],
        preparation: "Mix everything and have fun!",
        Source: "Super Smoothies, p. 142"
    }, 
    {
        name: "Tropical Melon",
        ingredients: [
            { food_id: "honeydew_melon_raw"},
            { food_id: "coconut_milk"}
        ],
        preparation: "Mix everything and have fun!",
        Source: "Super Smoothies, p. 51"
    }];
    

    鉴于使用术语“椰子,草莓”进行搜索,功能将返回:

    1. Coco Berry和Tropical Melon,因为两种成分都含有至少一种成分(椰奶)
    2. Coco Berry,因为这款冰沙有两种成分,第二种是缺少一种成分。
    3. 我尝试了什么以及我需要什么

      我知道要像“椰子”这样的搜索返回一个名为“椰奶”的食物,我必须将食物集合中的名称编入索引,我这样做了。

      我也搜索过,我发现我可能需要使用$lookup,但是,我不知道如何从这一点开始。我该怎么做?

1 个答案:

答案 0 :(得分:1)

我认为没有必要添加连接或索引你可以使用$ regex,让我尝试一下,将smothie视为你的收藏 `

db.collection.find({ingredients : {$elemMatch : {$or :[
{food_id : {$regex : "coconuts")},{food_id : {$regex : "strawberry")}]}}})

`

你的第二个问题 `

db.collection.find({ingredients : {$elemMatch : {$and :[
{food_id : {$regex : "coconuts")},{food_id : {$regex : "strawberry")}]}}})

`