mongodb - Mongoose 聚合 $LOOKUP 不显示表 2 中的数据
问题描述
在阅读了 mongodb mongoose 文档,阅读了许多在线示例后,我尝试创建两个集合来测试我自己的聚合 $lookup。运行代码时我没有收到任何错误,但我显示的是一个表中的数据,而不是加入的第二个集合。不知道为什么,但这一定是我正在做的事情,因为当我读到它时,它并不复杂;)
这是我的模式模型代码:
var Schema = mongoose.Schema;
// create a schema
var locationSchema = new Schema({
locationname: String,
locationdescription: String,
locationzip: Number,
locationphone: Number,
locationcategories: [{ locationname : String, categoryorder: Number, categoryname:
String, categorydescription: String, categoryitems: [] }],
items: [{categoryid : String, itemorder: Number, itemname: String, itemdescription:
String, itemprice: Number }],
created_at: Date
});
var optionsSchema = new Schema({
locationname: String,
admindescription: String,
headername: String,
headerdescription: String,
Options: [{ locationname : String, optionheadername : String, optionname: String,
optionprice: Number }],
items: [{ itemid: String }],
categories: [{ categoryid: String }]
});
var Hoptions = mongoose.model('Hoptions', optionsSchema);
var Location = mongoose.model('Location', locationSchema);
export default Location;
export { Hoptions };
位置模型 (Location.find({}).pretty() ) 显示以下内容:
{
"_id" : ObjectId("5f8b96103f187f3f8050d863"),
"locationname" : "location 1",
"locationdescription" : "location One",
"locationstreet" : "15588 main street",
"locationcity" : "Naples",
"locationstate" : "Florida",
"locationzip" : 10090,
"locationphone" : 8889788564,
"locationcategories" : [
{
"categoryitems" : [
{
"categoryid" : "5f8b963c3f187f3f8050d864",
"itemorder" : "1",
"itemname" : "item1",
"itemdescription" : "item1-cat1-location1",
"itemprice" : "1"
},
{
"categoryid" : "5f8b963c3f187f3f8050d864",
"itemorder" : "0",
"itemname" : "item2",
"itemdescription" : "item2-cat1-location1",
"itemprice" : "2"
}
],
"_id" : ObjectId("5f8b963c3f187f3f8050d864"),
"locationname" : "location 1",
"categoryorder" : 1,
"categoryname" : "cat1",
"categorydescription" : "cat1-location1"
},
{
"categoryitems" : [ ],
"_id" : ObjectId("5f8b965d3f187f3f8050d865"),
"locationname" : "location 1",
"categoryorder" : 2,
"categoryname" : "cat2",
"categorydescription" : "cat2-location1"
}
],
"items" : [ ],
"created_at" : ISODate("2020-10-18T01:10:40.206Z"),
"__v" : 0
}
我的 Hoptions 模型显示以下内容:
{
"_id" : ObjectId("5f8b973e3f187f3f8050d866"),
"locationname" : "location 1",
"admindescription" : "pizza options",
"headername" : " Pizza Size",
"headerdescription" : "Choose your pizza size:",
"Options" : [
{
"_id" : ObjectId("5f8b976a3f187f3f8050d867"),
"locationname" : "location 1",
"optionheadername" : " Pizza Size",
"optionname" : "Small Pizza",
"optionprice" : 10
},
{
"_id" : ObjectId("5f8b97793f187f3f8050d868"),
"locationname" : "location 1",
"optionheadername" : " Pizza Size",
"optionname" : "Medium Pizza",
"optionprice" : 15
},
{
"_id" : ObjectId("5f8b97843f187f3f8050d869"),
"locationname" : "location 1",
"optionheadername" : " Pizza Size",
"optionname" : "Large Pizza",
"optionprice" : 20
}
],
"items" : [ ],
"categories" : [ ],
"__v" : 0
}
现在,我使用聚合和 $lookup :
Hoptions.aggregate([
{
$lookup:
// "locations" 是 mongodb 集合名称。“Location”是我的模型名称 //我应该在 $lookup 部分使用模型名称“Location”还是数据库“locations”?{ from: "locations", localField: "locationname", foreignField: "locationname", as: "displayall" }
},
{
$project:
{
"headername": 1,
"locationzip": 1,
"locationzip": 1,
}
}
], function (err, results) {
console.log("results :", results)
});
我得到的是:
results : [ { _id: 5f8b973e3f187f3f8050d866, headername: ' Pizza Size' } ]
“headername”来自 hoptions 集合(Hoption 模型),但没有来自具有 locationzip 的位置集合(位置模型)。
显然,我是 mongodb 聚合管道的新手,如果有人看一看并指导我解决我的错误,我将不胜感激。
解决方案
试试这个查询 -
db.Hoptions.aggregate([
{
"$lookup": {
from: "locations",
localField: "locationname",
foreignField: "locationname",
as: "displayall"
}
},
{
$project: {
"headername": 1,
"locationzip": "$displayall.locationzip"
}
}
])
这里是Mongo游乐场
希望这就是你要找的。让我知道预期的输出是否不正确。
推荐阅读
- r - 单细胞实验。为什么我在单细胞实验中没有成功更改行名和列名?
- javascript - 如何从 Cloud Firestore 数据库中检索所有文档(包含图像 url 和名称)到网站?
- python - 如何在没有空格的文本列中查找所有文本
- excel - 获取“运行时错误'1004':范围类的选择方法失败”
- c++ - 为什么 moc 错误不是由纯方法引起的?
- cakephp - CakePHP 3.x 关于订单的 case 语句
- java - java.io.FileNotFoundException:打开失败:EISDIR(是一个目录)
- python - 输入在 VS Code 中可用?
- server - 带有 BI 应用程序的服务器每天在固定时间停机
- python - 无法导入名称“__check_build”(很可能是由于循环导入)