【问题标题】:Mongoose find in referenced document propertiesMongoose 在引用的文档属性中查找
【发布时间】:2014-08-23 13:41:53
【问题描述】:

我要根据引用的文档属性进行查询以查找匹配项。 我已经这样定义了我的架构:

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'
    }
}));

因此,当我在 Match 模型中搜索来自特定用户的路线时,我会执行类似的操作(也尝试不使用 '_id' 属性):

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

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

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

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

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

有人建议吗?非常感谢!

相关问题(但未提供可行的解决方案):

【问题讨论】:

    标签: node.js mongodb express mongoose documents


    【解决方案1】:

    我要根据嵌套文档属性进行查询以查找匹配项

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 2017-05-13
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      相关资源
      最近更新 更多