【问题标题】:Mongoose fetch records from two related collections with populateMongoose 使用填充从两个相关集合中获取记录
【发布时间】:2017-08-26 12:33:58
【问题描述】:

我需要知道如何在以下集合中执行查找操作。 集合 1 的 id 用作集合 2 中的 projectsId。我已经给出了contoller.js 和下面的模型文件,请告诉我我必须在哪里放置查找以从两个集合中获取记录

集合一:

/* 1 */
{
    "_id" : ObjectId("58dcda850a13352724d4c716"),
    "name" : "senthil",
    "designation" : "CI",
    "berief_text" : null,
    "status" : 1,
    "__v" : 0,
    "type" : 1
}

/* 2 */
{
    "_id" : ObjectId("58dcdade0a13352724d4c719"),
    "name" : "ssss",
    "designation" : "sssss",
    "berief_text" : null,
    "status" : 2,
    "__v" : 0
}

集合二:

/* 1 */
{
    "_id" : ObjectId("58dcda850a13352724d4c717"),
    "imageLocation" : "uploads\\project_images\\14908688692032.png",
    "projectId" : ObjectId("58dcda850a13352724d4c716"),
    "__v" : 0
}

/* 2 */
{
    "_id" : ObjectId("58dcda850a13352724d4c718"),
    "imageLocation" : "uploads\\project_images\\1490868869210201876891658ad792131c9520170222051225.JPG",
    "projectId" : ObjectId("58dcda850a13352724d4c716"),
    "__v" : 0
}

/* 3 */
{
    "_id" : ObjectId("58dcdade0a13352724d4c71a"),
    "imageLocation" : "uploads\\project_images\\14908689587042.png",
    "projectId" : ObjectId("58dcdade0a13352724d4c719"),
    "__v" : 0
}

/* 4 */
{
    "_id" : ObjectId("58dcdade0a13352724d4c71b"),
    "imageLocation" : "uploads\\project_images\\14908689587321.png",
    "projectId" : ObjectId("58dcdade0a13352724d4c719"),
    "__v" : 0
}

controller.js

var express = require("express"),
 router = express.Router(),
 project = require("../../models/project.js"),
 projectimage = require("../../models/projectimages.js"),
router.get("/", function(req, res) {



 project.find({}, function(err, data){
          if(err){
            res.send(err);
          }
          res.send(data);
        });

  projectimage.find({}, function(err, data){
          if(err){
            res.send(err);
          }
          res.send(data);
        });


})

项目.js

var mongoose = require("mongoose"),
 Schema = mongoose.Schema,
 objectId = mongoose.Schema.ObjectId;
    var projectSchema = new Schema({
      name    : {type: String, required : true},
      designation    : {type: String, required : true},
      status    : {type: Number, required : true},
      type    : {type: Number, required : true},
      berief_text : {type: String, required : true},
        }); 
    var project = mongoose.model("project", projectSchema);
    module.exports = project;

projectimages.js

var mongoose = require("mongoose"),
 Schema = mongoose.Schema,
 objectId = mongoose.Schema.ObjectId;

var ProjectimageSchema = new mongoose.Schema({
    imageLocation: String,
    projectId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'project'
    },

});

var projectimage = mongoose.model("projectimage", ProjectimageSchema);

module.exports = projectimage;

得到的输出

服务器运行于:http://localhost:3002

[ { _id: 58dcda850a13352724d4c716,
    name: 'senthil',
    designation: 'CI',
    berief_text: null,
    status: 1,
    __v: 0,
    type: 1 },
  { _id: 58dcdade0a13352724d4c719,
    name: 'ssss',
    designation: 'sssss',
    berief_text: null,
    status: 2,
    __v: 0 } ]
[ { _id: 58dcda850a13352724d4c717,
    imageLocation: 'uploads\\project_images\\14908688692032.png',
    projectId: 58dcda850a13352724d4c716,
    __v: 0 },
  { _id: 58dcda850a13352724d4c718,
    imageLocation: 'uploads\\project_images\\1490868869210201876891658ad792131c9520170222051225.JPG',
    projectId: 58dcda850a13352724d4c716,
    __v: 0 },
  { _id: 58dcdade0a13352724d4c71a,
    imageLocation: 'uploads\\project_images\\14908689587042.png',
    projectId: 58dcdade0a13352724d4c719,
    __v: 0 },
  { _id: 58dcdade0a13352724d4c71b,
    imageLocation: 'uploads\\project_images\\14908689587321.png',
    projectId: 58dcdade0a13352724d4c719,
    __v: 0 } ]
[ { _id: 58dcda850a13352724d4c716,
    name: 'senthil',
    designation: 'CI',
    berief_text: null,
    status: 1,
    __v: 0,
    type: 1 },
  { _id: 58dcdade0a13352724d4c719,
    name: 'ssss',
    designation: 'sssss',
    berief_text: null,
    status: 2,
    __v: 0 } ]
[ { _id: 58dcda850a13352724d4c717,
    imageLocation: 'uploads\\project_images\\14908688692032.png',
    projectId: 58dcda850a13352724d4c716,
    __v: 0 },
  { _id: 58dcda850a13352724d4c718,
    imageLocation: 'uploads\\project_images\\1490868869210201876891658ad792131c9520170222051225.JPG',
    projectId: 58dcda850a13352724d4c716,
    __v: 0 },
  { _id: 58dcdade0a13352724d4c71a,
    imageLocation: 'uploads\\project_images\\14908689587042.png',
    projectId: 58dcdade0a13352724d4c719,
    __v: 0 },
  { _id: 58dcdade0a13352724d4c71b,
    imageLocation: 'uploads\\project_images\\14908689587321.png',
    projectId: 58dcdade0a13352724d4c719,
    __v: 0 } ]

预期输出

[ { _id: 58dcda850a13352724d4c716,
    name: 'senthil',
    designation: 'CI',
    berief_text: null,
    status: 1,
    __v: 0,
    type: 1.
    images:[{ _id: 58dcda850a13352724d4c717,
    imageLocation: 'uploads\\project_images\\14908688692032.png',
    projectId: 58dcda850a13352724d4c716,
    __v: 0 },
  { _id: 58dcda850a13352724d4c718,
    imageLocation: 'uploads\\project_images\\1490868869210201876891658ad792131c9520170222051225.JPG',
    projectId: 58dcda850a13352724d4c716,
    __v: 0 }] 
},

]

我的每个循环

 project.find({}, function(err, data){
          if(err){
            res.send(err);
          }

for each (var v in data) {
    console.log(v);
}
        });

【问题讨论】:

  • 您问了 25 个问题,但没有标记一个正确答案?
  • 你的问题措辞有点混乱!让我了解您要做什么。你想让ProjectimageSchema 中的projectId 被实际的project 对象填充吗?
  • 是的,我需要这两个集合中的记录
  • 我投了赞成票,而不是正确标记@lin
  • @vimalkumar 太好了,现在尝试检查您的问题并标记正确答案,以便其他用户可以从中受益。它也是stackoverflow的工作方式。谢谢 =)

标签: angularjs node.js express mean-stack


【解决方案1】:

使用population 获取引用数据。虽然您的参考目前在您的ProjectimageSchema 中定义,但您也必须向projectsSchema 添加参考。您可以将 ProjectimageSchema 中的 ref 属性 projectId 重命名为 project 以使其更清晰。

项目架构

var projectSchema = new Schema({
    name: {type: String, required : true},
    designation: {type: String, required : true},
    status: {type: Number, required : true},
    type: {type: Number, required : true},
    berief_text: {type: String, required : true},
    images: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Projectimage'
    }
});

ProjectImages 架构

var ProjectimageSchema = new mongoose.Schema({
    imageLocation: String,
    project: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'project'
    }
});

完成此操作后,您可以使用填充获取相关数据 + 相关数据:

//get all project with relates images
project.find()
    .populate('images')
    .exec(function (err, post) {
        if (err) return handleError(err);
    });

//get all project images with relates projects
projectimage.find()
    .populate('project')
    .exec(function (err, post) {
        if (err) return handleError(err);
    });

【讨论】:

  • 我已经尝试过了,我已经发布了输出它是好的,但我需要像预期输出一样的输出
  • 输出有什么问题?它看起来确实是您需要的所有数据。
  • 没有错,它确实很有帮助,但是在显示项目详细信息时,输出格式应该与预期输出相似
  • 是的,但是您的预期输出是什么?
  • 嗯,m8,您使用我的答案获取了所需的数据。你不能自己创建forforEach 循环吗?
猜你喜欢
  • 2015-10-13
  • 2017-10-01
  • 2019-05-26
  • 2019-08-07
  • 1970-01-01
  • 2020-09-10
  • 2020-10-11
  • 2020-05-13
  • 1970-01-01
相关资源
最近更新 更多