如何在mongodb中的公共字段上加入两个集合?

时间:2019-04-01 21:06:20

标签: mongodb aggregate

在我的数据库中,有许多发行人和许多产品。用户可以创建(并拥有)多个发行人。我正在尝试运行查询 它将返回与由给定用户创建的发行人关联的所有产品。我希望返回的结果包括 与给定产品关联的发行人的名称(不仅限于ID)。

这是上下文的一些简化模式:

const OfferingSchema = new mongoose.Schema({
    issuerID: {
        type: String,
        required: true
    },
    offeringName: {
        type: String,
        required: true
    },
});
const Offering = mongoose.model('Offering', OfferingSchema, 'offerings');


const IssuerSchema = new mongoose.Schema({
  user_id: {
    type: String,
    required: false
  },
  name: {
    type: String,
    required: true
  },
});
const Issuer = mongoose.model("Issuer", IssuerSchema, "issuers");

据我了解,我需要使用$lookup来“联接”这两个集合。我尝试过的是这样:

db.offerings.aggregate([{
    $lookup:{from: "issuers",       
            localField: "issuerID",  
            foreignField: "_id", 
            as: "issuerInfoAilias" }
}])

但是我得到了每个产品,每个产品文档都有一个inssuerInfoAlias字段,它是一个空数组。

运行以下查询将返回issuerID5c953c18eb4a0a690892f001的产品

 db.offerings.findOne({"_id" : ObjectId("5c9baa8b1fe76d79a108f3fb")})

运行以下查询将返回发行者:

 db.issuers.findOne({"_id":ObjectId("5c953c18eb4a0a690892f001")})

所以我知道数据库中至少存在一对。

我希望获得所有产品的所有产品,包括与产品文档issuerID字段中的ID相关的发行人名称。我需要进行哪些更改才能将其退回?

1 个答案:

答案 0 :(得分:0)

根据我在架构中看到的内容,我认为您需要使用foreignField : "user_id"而不是foreignField : "_id"

尝试一下:

db.offerings.aggregate([{
    $lookup:{
        from: "issuers",       
        localField: "issuerID",  
        foreignField: "user_id", 
        as: "issuerInfoAilias" 
    }
}])
相关问题