【问题标题】:mongo nested join mongodbmongo嵌套连接mongodb
【发布时间】:2017-03-21 17:59:16
【问题描述】:

我正在尝试为 2 个集合设置与 MongoDb 的合并。 集合是嵌套的。 我有 2 个收藏:

1/ 选项

{
    "_id": {
        "$oid": "58c9866ff36d286bfca335b4"
    },
    "design": {
        "mainPage": {
            "imgRight": "58cc750ddc238d05dd6ca525",
            "imgLeft": "58cc750ddc238d05dd6ca526"
        }
    }
}

2/ 表格

{
    "_id": {
        "$oid": "58cc750ddc238d05dd6ca525"
    },
    "imagePath": "logo.png"
}

如何进行聚合以获得此结果:

{
    "_id": {
        "$oid": "58c9866ff36d286bfca335b4"
    },
    "design": {
        "mainPage": {
            "imgRight": "58d07571d9d39e50166b5b3d",
            "form_docs" : {
                "imagePath": "logo.png"
            }
            "imgLeft": "58cc750ddc238d05dd6ca526",
            "form_docs" : {
                "imagePath": ""
            }
        }
    }
}

我正在尝试使用下面的 sn-p,但它不起作用:

   Options.aggregate([
        { "$unwind": "$design" },
        { "$unwind": "$design.mainPage" },

        {
          $lookup:
            {
              from: "forms",
              localField: "design.mainPage.imgLeft",
              foreignField: "_id",
              as: "form_docs"
            }
       }

])

【问题讨论】:

  • 您不必展开嵌套文档。您加入的字段类型在本地和国外集合中应该相同。目前它的ObjectIdString
  • 谢谢。当我这样做时:Options.aggregate([ { $lookup: { from: "forms", localField: "design.mainPage.imgLeft", foreignField: "_id", as: "form_docs" } } ]) 它也不起作用..
  • 不会,因为design.mainPage.imgLeft (String) 的类型与_id (ObjectId) 不同
  • 我想答案就在这里..jira.mongodb.org/browse/SERVER-22781
  • 另一种答案是在整个数据库中一致地使用数据;如果 forms 集合中的值为ObjectId("58cc750ddc238d05dd6ca525"),那么 options 集合中的匹配值也应该是ObjectId("58cc750ddc238d05dd6ca525")(ObjectId 数据类型),而不是"58cc750ddc238d05dd6ca525" (字符串数据类型)。

标签: mongodb merge nested aggregation-framework


【解决方案1】:

我已经通过使用 populate() 的 Mongoose 出售了我的问题。 http://mongoosejs.com/docs/populate.html

1/ 定义架构:

var options = new Schema({
    design: {
      mainPage : {
        _imgLeft:[{type: Schema.Types.ObjectId, ref: 'Form'}],
        _imgRight:[{type: Schema.Types.ObjectId, ref: 'Form'}],
      }
    },
  }
);

2/ 猫鼬函数是:

  Options
  .findOne()
  .populate('design.mainPage._imgLeft')
  .populate('design.mainPage._imgRight')
  .exec(function (err, obj) {
    return res.status(200).json({
      message: 'Successfull',
      obj: obj
    })
  });

感谢您的帮助

【讨论】:

    猜你喜欢
    • 2018-07-06
    • 2021-02-22
    • 2015-04-02
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    相关资源
    最近更新 更多