【问题标题】:how to implement the function like left join of mysql in mongoose如何在mongoose中实现mysql的left join之类的功能
【发布时间】:2015-03-09 17:35:55
【问题描述】:

我打算在mongoose中实现mysql的left join之类的功能。 日期是

var mongoose = require('mongoose')
  , Schema = mongoose.Schema

var personSchema = Schema({
  _id     : Number,
  name    : String
});

var storySchema = Schema({
  _creator : { type: Number, ref: 'Person' },
  title    : String
});

var personProfile = Schema({
   userid : {type: Number, ref: 'Person'},
   birthday: Date,
   profilelink: String,
   email: String
});

var Story  = mongoose.model('Story', storySchema);
var Person = mongoose.model('Person', personSchema);
var personProfile = mongoose.model('Personprofile', personProfile );

我将展示带有用户个人资料的 Story 模型。 我们必须使用故事的_creator和personProfile的用户ID来获取个人资料信息

如何使用 mongoose 查询获取信息?

谢谢奈利斯

【问题讨论】:

  • 您的意思是通过 Mongoose population 或其他方式关注裁判?您能否编辑您的问题以包含您正在使用的查询和所需的输出?

标签: node.js mongodb mongoose


【解决方案1】:

您尝试做的事情是不可能的,因为 mongodb 上没有 join 语句。

您可以通过两种方式实现此目的:

1 - 通过 DBRefs: 将您的架构更改为包含所有用户信息的架构,并且不要像您那样将它们拆分为两个不同的架构,请参阅denormalized。然后你可以使用Population函数来获取所有的人数据。

2 - 手动参考:第二种解决方案是使用用户 ID 作为过滤器,对数据库进行第二次调用以获取 personProfile 数据。

示例 1:

这样您无需再次调用数据库即可获取所有人的数据。

var personSchema = Schema({
  _id     : Number,
  name    : String,
  birthday: Date,
  profilelink: String,
  email: String
});

var storySchema = Schema({
  _creator : { type : Schema.Types.ObjectId, ref: 'Person' },
  title    : String
});

Story
.find()
.populate(['_creator'])
.exec(function(err, stories) {
    //do your stuff here
}

请注意,我使用的是 Schema.Types.ObjectId 类型,而不是 Number。这样,您可以通过 _idperson 对象_creator 分配一个新值,mongoose 会将对象转换为其 _id .例如,您可以发布类似

{
    _creator : {
        _id     : 123123123123,
        name    : 'Foo',
        birthday: '0000-00-00',
        profilelink: 'http://foo.bar',
        email: 'foo@bar.com'
    },
    title    : 'Mr'
}

...猫鼬将转换为

{
    _creator : 123123123123,
    title    : 'Mr'
}

示例 2:

这样您的数据仍然正常化,您可以通过第二次调用获取所有人员数据。

Story
.find()
.exec(function(err, stories) {
    var arrayLength = stories.length;

    for (var i = 0; i < arrayLength; i++) {
        var story = stories[i];
        personProfile.findById(story._creator, function (err, person) {
            story._creator = person;
        }
    };
    // do your stuff here
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 2012-09-10
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多