如何在一对一关系中使用记录ID创建.find()

时间:2014-04-11 08:46:31

标签: node.js sails.js sails-mongo

在sails-mongo(0.10.0-rc3 / beta)中,看起来外部id被转换为ObjectID所以如果我有一对一关系的两个模型,我如何使用id进行查询?

示例:

ModelA
attributes: {
 user: { model: 'User' }
}

User.js
attributes: {
  ...
}

现在我想查询像ModelA.find(user: req.session.user).exec(console.log)那样,日志返回null []而不是ModelA中属于当前用户的所有项目。

编辑: 我尝试使用mongodb模块req.session.user再次将new ObjectID(req.session.user)转换为ObjectID,一切正常。我不确定为什么它最后一次没用。

由于

2 个答案:

答案 0 :(得分:0)

sails-redis@0.10.0-rc3查询相关模型似乎表现得如预期。

首先,我创建了一个基本的User模型:

module.exports = {
    attributes: {
        name: 'string'
    }
};

第二个ModelA模型与关联的User

module.exports = {
    attributes: {
        user: { model: 'User' }
    }
};

然后我创建了一个小的mocha测试来检查关联查询并减少在其他地方引入的任何错误(例如在你的会话处理中):

var expect = require('chai').expect,
    sails = require('sails'),
    async = require('async');

describe('sails-mongo associations', function() {

    before(function (done) {
        sails.lift(function (err, sails) {
            done(err);
        });
    });

    after(function (done) {
        sails.lower(function (err) {
            done(err);
        });
    });

    beforeEach(function(done) {
        async.auto({
            deleteUsers: function(done) {
                User.destroy(done);
            },
            deleteModelA: function(done) {
                ModelA.destroy(done);
            }
        }, function(err) {
            done(err);
        });
    });

    describe("#find", function() {
        it("should allow to find a record using an associated model", function(done) {
            User.create({ name: 'Test User' }).exec(function(err, user) {
                expect(err).to.be.null;
                expect(user).to.contain.key('id');

                ModelA.create({ user: user.id }).exec(function(err, model) {
                    expect(err).to.be.null;
                    expect(model).to.contain.keys('id', 'user');

                    ModelA.find({ user: user }).populate('user').exec(function(err, model) {
                        expect(err).to.be.null;
                        expect(model).not.to.be.null.and.contain.key('user', user);
                        done();
                    });
                }); 
            });
        });

    });
});

mocha测试成功完成,没有任何错误。这可能意味着(正如Scott Gress已经假设的那样)您的req.session.user变量不包含您期望的值。内部转换为mongos ObjectID正在运行。

干杯, 大卫

答案 1 :(得分:0)

我自己也有同样的问题。似乎sails-mongo不会将您的字符串ID转换为ObjectId() - 语法,除非它是主键(_id)。

Luckily, this is fixed in a recent commit

更新您的package.json以使用主分支,或等待rc4释放。