$lookup搜索蒙戈德布



>Objective

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

背景

我在Mongo上有一个冰沙数据库。冰沙是引用食物对象的对象,其表示形式如下:

{
    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
}

问题

考虑到这些架构,我确保冰沙对象知道构建它的所有 Food 对象。由于每个冰沙对象最多有 6 或 7 个食物对象,我相信这是最佳选择,因为它遵循 MongoDB 的最小基数原则。

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

  1. 给定成分名称列表,返回至少含有其中一种成分的所有冰沙
  2. 给定成分名称列表,仅返回包含所有这些成分的冰沙。

而且我不知道如何使用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. 可浆果和热带甜瓜,因为两种冰沙都至少含有一种成分(椰奶(
  2. 可可浆果,因为这种冰沙有两种成分,第二种成分缺少一种成分。

我尝试了什么和我需要什么

我知道要像"椰子"这样的搜索返回名为"椰奶"的食物,我必须索引食物集合中的名称,我做到了。

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

我认为没有必要添加可以使用$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")}]}}})

'

相关内容

  • 没有找到相关文章

最新更新