首页 > 解决方案 > 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 聚合管道的新手,如果有人看一看并指导我解决我的错误,我将不胜感激。

标签: mongodbmongoose

解决方案


试试这个查询 -

db.Hoptions.aggregate([
  {
    "$lookup": {
      from: "locations",
      localField: "locationname",
      foreignField: "locationname",
      as: "displayall"
    }
  },
  {
    $project: {
      "headername": 1,
      "locationzip": "$displayall.locationzip"
    }
  }
])

这里是Mongo游乐场

希望这就是你要找的。让我知道预期的输出是否不正确。


推荐阅读