$lookup 搜索 Mongodb
$lookup search Mongodb
Objective
使用 MongoDB 中的引用进行高效搜索。
背景
我在 Mongo 上有一个 Smoothie DB。冰沙是一个引用了 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.
但是,现在我想启用以下功能:
- 给定成分名称列表,return 所有至少包含其中一种成分的冰沙
- 给定成分名称列表,return 只有包含 所有 这些成分的冰沙。
而且我不知道如何使用 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"
}];
如果使用术语 "coconuts, strawberry" 进行搜索,功能将 return:
- 可可浆果和热带甜瓜,因为这两种冰沙都至少含有一种成分(椰奶)
- 可可浆果,因为这款冰沙有两种成分,而第二种缺少一种成分。
我尝试过的和我需要的
我知道要将 "coconuts" return 之类的搜索变成名称为 "Coconut Milk" 的食物,我必须为食物集合中的名称建立索引,我确实这样做了。
我也进行了搜索,发现我可能需要使用 $lookup
,但是,我不知道如何从那一点开始。我该怎么做?
我认为不需要添加连接或索引你可以使用 $regex,让我试试我的手,考虑 smothie 作为你的 collection
`
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")}]}}})
`
Objective
使用 MongoDB 中的引用进行高效搜索。
背景
我在 Mongo 上有一个 Smoothie DB。冰沙是一个引用了 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.
但是,现在我想启用以下功能:
- 给定成分名称列表,return 所有至少包含其中一种成分的冰沙
- 给定成分名称列表,return 只有包含 所有 这些成分的冰沙。
而且我不知道如何使用 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"
}];
如果使用术语 "coconuts, strawberry" 进行搜索,功能将 return:
- 可可浆果和热带甜瓜,因为这两种冰沙都至少含有一种成分(椰奶)
- 可可浆果,因为这款冰沙有两种成分,而第二种缺少一种成分。
我尝试过的和我需要的
我知道要将 "coconuts" return 之类的搜索变成名称为 "Coconut Milk" 的食物,我必须为食物集合中的名称建立索引,我确实这样做了。
我也进行了搜索,发现我可能需要使用 $lookup
,但是,我不知道如何从那一点开始。我该怎么做?
我认为不需要添加连接或索引你可以使用 $regex,让我试试我的手,考虑 smothie 作为你的 collection `
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")}]}}})
`