【问题标题】:How to make a .find() using a record id on one to one relationship如何在一对一关系上使用记录 ID 制作 .find()
【发布时间】:2014-04-11 08:46:30
【问题描述】:

在sails-mongo(0.10.0-rc3/beta) 中,外部ID 似乎已转换为ObjectID,因此如果我有两个具有一对一关系的模型,如何使用ID 进行查询?

例子:

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

User.js
attributes: {
  ...
}

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

编辑: 我尝试使用 mongodb 模块 new ObjectID(req.session.user) 再次将 req.session.user 转换为 ObjectID,一切正常。我不知道为什么上次没有成功。

谢谢

【问题讨论】:

  • 您是否验证了req.session.user 包含有效的用户ID?
  • 是的,我打印出 req.session.user 并返回了正确的用户 ID,当我执行 typeof req.session.id 时,我感到刺痛,所以我想知道是否应该将其转换为 ObjectID 但仍然没有正在返回结果。

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


【解决方案1】:

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 的内部转换正在运行。

干杯, 大卫

【讨论】:

  • 我已经尝试过了,我得到了空数组[],model.user 是undefined。我已经打印了用户并且它返回了正确的用户数据。我也试过ModelA.find({user: user.id})而不是{user: user}但仍然没有返回结果。
  • 您的 ModelA 文档是否包含任何数据?为确保您的数据库处于正确状态,您可以尝试获取整个文档并手动查找数据。
  • 是的,我检查了 user 和 modela 表,并且有内容。并且所有内容都连接到用户并且与用户相同。
【解决方案2】:

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

Luckily, this is fixed in a recent commit

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

【讨论】:

  • 谢谢,是的,这也是我观察到的,我很高兴这个问题已经得到解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 2018-02-21
  • 1970-01-01
  • 2013-09-16
相关资源
最近更新 更多