Mongoose在引用的文档属性中查找

时间:2014-07-02 16:43:01

标签: node.js mongodb express mongoose documents

我在查询上疯狂,根据引用的文档属性查找匹配项。 我已经定义了这样的架构:

mongoose.model('Route', new mongoose.Schema({
    user: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    }
}));

mongoose.model('Match', new mongoose.Schema({
    route: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Route'
    }
}));

因此,当我在匹配模型中搜索来自特定用户的路线时,我会做类似的事情(也尝试没有' _id'属性):

match.find({'route.user._id': '53a821577a24cbb86cd290d0'}, function(err, docs){});

但不幸的是,它并没有给我任何结果。我也试图填充模型:

match.find({'route.user._id': '53a821577a24cbb86cd290d0'}).populate('route').exec(function(err, docs){});

但这并没有什么不同。我所知道的解决方案(但不要认为它们是最好的):

  1. 查询所有结果并迭代它们,按代码过滤
  2. 将嵌套文档保存为路径模型中的数组(因此不是引用)
  3. 有人建议吗?非常感谢提前!

    相关问题(但不是提供的工作解决方案):

1 个答案:

答案 0 :(得分:5)

  

我在查询时很难找到基于嵌套文档属性的匹配

您没有嵌套文档。您有引用,它们只是指向驻留在其他集合中的文档的ID。这是您的基本断开连接。如果您确实拥有嵌套文档,那么您的查询将匹配。

你遇到了“mongodb不做加入”的情况。每个MongoDB查询都可以在一个且仅一个集合中搜索文档。您的“匹配”模型指向路由,并且路由指向用户,但匹配并不直接了解用户,因此您的架构不支持您要执行的查询。您可以先搜索“routes”集合并使用该查询的结果查找相应的“匹配”文档,或者您可以对模式进行反规范化并将routeId和userId直接存储在匹配文档中,在这种情况下,您可以然后可以使用单个查询。

根据您的问题标题,您似乎想要嵌套文档,但是您在mongoose中将它们定义为引用而不是真正的嵌套模式。使用完整的嵌套模式并修复数据,然后您的查询应该开始匹配。