【问题标题】:Mongoose query into an embedded documentMongoose 查询嵌入文档
【发布时间】:2012-08-26 10:10:51
【问题描述】:

我已经用 Mongoose 定义了以下架构:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.Types.ObjectId;

var New = new Schema({
    _id: ObjectId,
    lang: String,
    formatted: Boolean,
    downloaded: Date,
    content: {
        title: String,
        link: String,
        description: String,
        meta: String,
        author: String
    }
});

module.exports = New;

我正在尝试执行以下查询:

NewsModel.find({'lang':'en', 'content.link':'test'}).exec(callback);

查询没有响应,它永远不会进入回调函数。这很奇怪,因为这种类型的查询(搜索两个字符串字段)在我定义的另一个模式中工作得很好,但在这个模式中不行。另一种Schema更简单,没有任何嵌入文档。

奇怪的是以下工作:

NewsModel.find({'lang':'en', 'formatted':true}).exec(callback);

是否有任何架构错误?知道我做错了什么吗?

非常感谢,

路易斯·卡帕。


[更新]

我尝试了你的建议,但没有办法。我认为只有两种选择:

1.我发布的 Schema 有问题。

2. Mongoose 在查询嵌入复杂参数的文档(例如另一个文档)时遇到问题。

我曾使用过 MongoDB shell、MongoDB Java 驱动程序和 Spring MongoDB Data,这是我第一次遇到这种奇怪的行为。

我测试过的查询是:

NewsModel.find({'lang':'en', 'content.link':'test'}).exec(callback);
NewsModel.find({'lang':'en'}).where('content.link').equals('test').exec(callback);
NewsModel.find({'content.link':'test'}).where('lang').equals('en').exec(callback);
NewsModel.find({'content.link':'test'}).exec(callback); //  That demonstrates that Mongoose has problems with subelements.
NewsModel.find().where('content.link').equals('test').exec(callback); // This one too.

还有一个与 MongoDB shell 完美配合的示例:

db.news.find({ 'content.link': /test/, lang: 'en' })

我担心 Mongoose 不会返回零结果的空响应。相反,它通过等待和等待响应来保持应用程序处于待机状态,并且从不进入回调函数。

有什么想法吗?你有过类似的经历吗?

非常感谢!

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    在第一个查询中,链接属性不在文档的“根”,您要搜索“content.link”而不是“链接”(我不知道当前的猫鼬版本是否支持"." 在嵌入文档中查找内容)

    【讨论】:

    • 很抱歉,我复制了错误的查询:我写的“链接”是“content.link”。那是不起作用的查询。
    【解决方案2】:

    你不想

    NewsModel.find({'lang':'en', 'content.link':'test'}).exec(callback);
    

    查询您的嵌入文档?

    看到这个答案:

    Finding an Embedded Document by a specific property in Mongoose, Node.js, MongodDB

    【讨论】:

      【解决方案3】:
      NewsModel.find({'lang':'en', 'content.link':'test'}).exec(callback); 
      

      可能正在尝试查找名称为“content.link”而不是“内容”的字段,请尝试

      NewModel.where('lang').equals('en')  
              .where('content').link.equals('test') 
              .exec(callback)
      

      【讨论】:

        【解决方案4】:

        已解决

        这是 Mongoose 的查询性能错误。我有一个包含大约 100K 文档的测试集合,可以对这些文档执行查询,而且我还没有定义带有“lang”和“content.link”的复合索引。查询延迟太多,Mongoose 或 MongoDB 没有发出任何超时警告或错误消息。定义复合索引后,查询工作正常。不过……

        1. 查询工作正常,在 MongoDB shell 中执行它们。我不知道为什么 Mongoose 这么慢。也许涉及的序列化 - 反序列化 - 验证过程会产生延迟。

        2. 即使没有定义任何索引,我也无法相信对于只有 100K 文档的简单测试集合,该简单查询的性能会如此差。 MongoDB 本身会消耗大量资源来快速处理查询和响应。老实说,我对 MongoDB - Mongoose 的期望更高。

        我的建议/建议:

        注意索引配置。

        如果您想快速搜索,请查看任何 Node.js Apache Solr 模块。

        【讨论】:

          猜你喜欢
          • 2012-06-23
          • 1970-01-01
          • 2012-02-23
          • 2014-08-05
          • 2012-10-17
          • 2012-08-22
          • 2013-03-07
          • 1970-01-01
          • 2015-04-27
          相关资源
          最近更新 更多