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

Wou*_*ter 2 documents mongoose mongodb node.js express

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

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'
    }
}));
Run Code Online (Sandbox Code Playgroud)

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

match.find({'route.user._id': '53a821577a24cbb86cd290d0'}, function(err, docs){});
Run Code Online (Sandbox Code Playgroud)

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

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

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

  1. 查询所有结果并迭代它们,按代码过滤
  2. 将嵌套文档保存为路径模型中的数组(因此不是引用)

有人建议吗?提前谢谢了!

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

Pet*_*ons 5

我在查询上发现基于嵌套文档属性的匹配

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

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

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