如何使用 lookup mongodb hapijs 从其他集合中为集合中的每个文档获取文档数组
how to fetch array of documents from other collections for each document in a collection using lookup mongodb hapijs
我正在使用 MongoDB 和 HapiJs
我有 3 mongo 个数据库集合,如下所示:
companies: [
{_id: "autogeneratedId", name: "companyname1"},
{_id: "autogeneratedId", name: "companyname2"}
]
employees: [
{_id: "autogeneratedId", salary: 10000, employeename: "employeename1", "company_id": "_id of company"},
{_id: "autogeneratedId", salary: 50000, employeename: "employeename2", "company_id": "_id of company"},
{_id: "autogeneratedId", salary: 25000, employeename: "employeename3", "company_id": "_id of company"}
]
products: [
{_id: "autogeneratedId", price: 900, productname: "productname1", "company_id": "_id of company"},
{_id: "autogeneratedId", price: 400, productname: "productname2", "company_id": "_id of company"},
{_id: "autogeneratedId", price: 500, productname: "productname3", "company_id": "_id of company"}
]
我正在尝试从 companies
集合中获取公司列表。现在连同 companies
的列表,我还想根据 companies
集合的 _id 从集合 products
和 employees
中获取每个相应公司的产品和员工列表。这是我正在尝试的代码
db.getCollection('companies').aggregate([
{
$lookup:
{
from: "employees",
localField: "_id",
foreignField: "company_id",
as: "employees_array"
}
},
{
$lookup:
{
from: "products",
localField: "_id",
foreignField: "company_id",
as: "products_array"
}
},
])
但是由于某些原因,上面的代码 returns 在 products_array 和 employees_array 中是一个空数组。那么,谁能告诉我我在这里做错了什么?
同样在 employees_array 和 products_array 中,我只想获取基于工资 >= 10000 的员工和价格 >= 500 的产品等条件的数据。那么我该如何实现呢?
这是我添加的文档:
公司
{
"_id" : ObjectId("5a3455b69beb3178555e98da"),
"name" : "companyname1"
}
{
"_id" : ObjectId("5a3455b69beb3178555e98dc"),
"name" : "companyname2"
}
员工
{
"_id" : ObjectId("5a34564c9beb3178555e990d"),
"salary" : 10000,
"employeename" : "employeename1",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
}
{
"_id" : ObjectId("5a34564c9beb3178555e990f"),
"salary" : 50000,
"employeename" : "employeename2",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
}
{
"_id" : ObjectId("5a34564c9beb3178555e9911"),
"salary" : 25000,
"employeename" : "employeename3",
"company_id" : ObjectId("5a3455b69beb3178555e98dc")
}
产品
{
"_id" : ObjectId("5a3456929beb3178555e991e"),
"price" : 900,
"productname" : "productname1",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
}
{
"_id" : ObjectId("5a3456929beb3178555e9920"),
"price" : 400,
"productname" : "productname2",
"company_id" : ObjectId("5a3455b69beb3178555e98dc")
}
{
"_id" : ObjectId("5a3456929beb3178555e9922"),
"price" : 500,
"productname" : "productname3",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
}
仅应用您的查询时:
db.getCollection('companies').aggregate([{
$lookup: {
from: "employees",
localField: "_id",
foreignField: "company_id",
as: "employees_array"
}
},
{
$lookup: {
from: "products",
localField: "_id",
foreignField: "company_id",
as: "products_array"
}
}
])
}
如果您的字段命名为您在问题中发布的名称,那么您应该会得到结果。寻找某种类型或其他东西。我得到以下结果(根据您的描述似乎是正确的):
{
"_id" : ObjectId("5a3455b69beb3178555e98da"),
"name" : "companyname1",
"employees_array" : [
{
"_id" : ObjectId("5a34564c9beb3178555e990d"),
"salary" : 10000,
"employeename" : "employeename1",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
},
{
"_id" : ObjectId("5a34564c9beb3178555e990f"),
"salary" : 50000,
"employeename" : "employeename2",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
}
],
"products_array" : [
{
"_id" : ObjectId("5a3456929beb3178555e991e"),
"price" : 900,
"productname" : "productname1",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
},
{
"_id" : ObjectId("5a3456929beb3178555e9922"),
"price" : 500,
"productname" : "productname3",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
}
]
}
{
"_id" : ObjectId("5a3455b69beb3178555e98dc"),
"name" : "companyname2",
"employees_array" : [
{
"_id" : ObjectId("5a34564c9beb3178555e9911"),
"salary" : 25000,
"employeename" : "employeename3",
"company_id" : ObjectId("5a3455b69beb3178555e98dc")
}
],
"products_array" : [
{
"_id" : ObjectId("5a3456929beb3178555e9920"),
"price" : 400,
"productname" : "productname2",
"company_id" : ObjectId("5a3455b69beb3178555e98dc")
}
]
}
如果您想要这些 salary >= 10000 and products having price >= 500
条件,您必须像这样制定聚合管道:
db.getCollection('companies').aggregate([{
$lookup: {
from: "employees",
localField: "_id",
foreignField: "company_id",
as: "employees_array"
}
},
{
$lookup: {
from: "products",
localField: "_id",
foreignField: "company_id",
as: "products_array"
}
},
{
$project: {
employees: {
$map: {
input: {
"$filter": {
"input": "$employees_array",
"as": "employee",
"cond": {
"$gte": ["$$employee.salary", 10000]
}
}
},
as: "emp",
in: {
"salary": "$$emp.salary",
"name": "$$emp.employeename"
// You can add more fields
}
}
},
products: {
$map: {
input: {
"$filter": {
"input": "$products_array",
"as": "product",
"cond": {
"$gte": ["$$product.price", 500]
}
}
},
as: "prd",
in: {
"price": "$$prd.price",
"productname": "$$prd.productname"
// you can add more fields
}
}
}
}
}
])
如果某些数组不满足此 salary >= 10000
(对于员工)或此 price >= 500
(对于产品),您可能会得到 0 个结果,但这是正常的。
我正在使用 MongoDB 和 HapiJs 我有 3 mongo 个数据库集合,如下所示:
companies: [
{_id: "autogeneratedId", name: "companyname1"},
{_id: "autogeneratedId", name: "companyname2"}
]
employees: [
{_id: "autogeneratedId", salary: 10000, employeename: "employeename1", "company_id": "_id of company"},
{_id: "autogeneratedId", salary: 50000, employeename: "employeename2", "company_id": "_id of company"},
{_id: "autogeneratedId", salary: 25000, employeename: "employeename3", "company_id": "_id of company"}
]
products: [
{_id: "autogeneratedId", price: 900, productname: "productname1", "company_id": "_id of company"},
{_id: "autogeneratedId", price: 400, productname: "productname2", "company_id": "_id of company"},
{_id: "autogeneratedId", price: 500, productname: "productname3", "company_id": "_id of company"}
]
我正在尝试从 companies
集合中获取公司列表。现在连同 companies
的列表,我还想根据 companies
集合的 _id 从集合 products
和 employees
中获取每个相应公司的产品和员工列表。这是我正在尝试的代码
db.getCollection('companies').aggregate([
{
$lookup:
{
from: "employees",
localField: "_id",
foreignField: "company_id",
as: "employees_array"
}
},
{
$lookup:
{
from: "products",
localField: "_id",
foreignField: "company_id",
as: "products_array"
}
},
])
但是由于某些原因,上面的代码 returns 在 products_array 和 employees_array 中是一个空数组。那么,谁能告诉我我在这里做错了什么?
同样在 employees_array 和 products_array 中,我只想获取基于工资 >= 10000 的员工和价格 >= 500 的产品等条件的数据。那么我该如何实现呢?
这是我添加的文档:
公司
{
"_id" : ObjectId("5a3455b69beb3178555e98da"),
"name" : "companyname1"
}
{
"_id" : ObjectId("5a3455b69beb3178555e98dc"),
"name" : "companyname2"
}
员工
{
"_id" : ObjectId("5a34564c9beb3178555e990d"),
"salary" : 10000,
"employeename" : "employeename1",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
}
{
"_id" : ObjectId("5a34564c9beb3178555e990f"),
"salary" : 50000,
"employeename" : "employeename2",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
}
{
"_id" : ObjectId("5a34564c9beb3178555e9911"),
"salary" : 25000,
"employeename" : "employeename3",
"company_id" : ObjectId("5a3455b69beb3178555e98dc")
}
产品
{
"_id" : ObjectId("5a3456929beb3178555e991e"),
"price" : 900,
"productname" : "productname1",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
}
{
"_id" : ObjectId("5a3456929beb3178555e9920"),
"price" : 400,
"productname" : "productname2",
"company_id" : ObjectId("5a3455b69beb3178555e98dc")
}
{
"_id" : ObjectId("5a3456929beb3178555e9922"),
"price" : 500,
"productname" : "productname3",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
}
仅应用您的查询时:
db.getCollection('companies').aggregate([{
$lookup: {
from: "employees",
localField: "_id",
foreignField: "company_id",
as: "employees_array"
}
},
{
$lookup: {
from: "products",
localField: "_id",
foreignField: "company_id",
as: "products_array"
}
}
])
}
如果您的字段命名为您在问题中发布的名称,那么您应该会得到结果。寻找某种类型或其他东西。我得到以下结果(根据您的描述似乎是正确的):
{
"_id" : ObjectId("5a3455b69beb3178555e98da"),
"name" : "companyname1",
"employees_array" : [
{
"_id" : ObjectId("5a34564c9beb3178555e990d"),
"salary" : 10000,
"employeename" : "employeename1",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
},
{
"_id" : ObjectId("5a34564c9beb3178555e990f"),
"salary" : 50000,
"employeename" : "employeename2",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
}
],
"products_array" : [
{
"_id" : ObjectId("5a3456929beb3178555e991e"),
"price" : 900,
"productname" : "productname1",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
},
{
"_id" : ObjectId("5a3456929beb3178555e9922"),
"price" : 500,
"productname" : "productname3",
"company_id" : ObjectId("5a3455b69beb3178555e98da")
}
]
}
{
"_id" : ObjectId("5a3455b69beb3178555e98dc"),
"name" : "companyname2",
"employees_array" : [
{
"_id" : ObjectId("5a34564c9beb3178555e9911"),
"salary" : 25000,
"employeename" : "employeename3",
"company_id" : ObjectId("5a3455b69beb3178555e98dc")
}
],
"products_array" : [
{
"_id" : ObjectId("5a3456929beb3178555e9920"),
"price" : 400,
"productname" : "productname2",
"company_id" : ObjectId("5a3455b69beb3178555e98dc")
}
]
}
如果您想要这些 salary >= 10000 and products having price >= 500
条件,您必须像这样制定聚合管道:
db.getCollection('companies').aggregate([{
$lookup: {
from: "employees",
localField: "_id",
foreignField: "company_id",
as: "employees_array"
}
},
{
$lookup: {
from: "products",
localField: "_id",
foreignField: "company_id",
as: "products_array"
}
},
{
$project: {
employees: {
$map: {
input: {
"$filter": {
"input": "$employees_array",
"as": "employee",
"cond": {
"$gte": ["$$employee.salary", 10000]
}
}
},
as: "emp",
in: {
"salary": "$$emp.salary",
"name": "$$emp.employeename"
// You can add more fields
}
}
},
products: {
$map: {
input: {
"$filter": {
"input": "$products_array",
"as": "product",
"cond": {
"$gte": ["$$product.price", 500]
}
}
},
as: "prd",
in: {
"price": "$$prd.price",
"productname": "$$prd.productname"
// you can add more fields
}
}
}
}
}
])
如果某些数组不满足此 salary >= 10000
(对于员工)或此 price >= 500
(对于产品),您可能会得到 0 个结果,但这是正常的。