Mongoose查询到嵌入式文档

时间:2012-08-31 14:58:53

标签: node.js mongodb mongoose

我使用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);

查询没有响应,它永远不会进入回调函数。这很奇怪,因为这种类型的查询(搜索到两个String字段)与我定义的另一个Schema很好用,但是没有这个。另一个Schema更简单,没有任何嵌入式文档。

奇怪的是,以下工作:

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

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

非常感谢,

Luis Cappa。


[增订]

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

1。我发布的架构有问题。

2。 Mongoose在查询嵌入复杂参数(如其他文档)的文档时遇到问题。

我使用过MongoDB shell,MongoDB Java Driver和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不会返回空响​​应,结果为零。相反,它通过等待和等待响应来保持应用程序处于待机状态,并且永远不会在回调函数中进入

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

非常感谢!

4 个答案:

答案 0 :(得分:2)

<强>解决

这是Mongoose的查询性能错误。我有一个包含大约100K文件的测试集合,执行查询,我没有用'lang'和'content.link'定义复合索引。查询延迟太多,Mongoose或MongoDB没有提醒任何超时警告或错误消息。在定义复合索引之后,查询工作为O.K.然而...

  1. 查询工作O.K在MongoDB shell中执行它们。我不知道为什么Mongoose太慢了。也许序列化 - 反序列化 - 验证所涉及的过程会导致延迟。

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

  3. 我的建议/建议:

    注意索引配置。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你不想要

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

查询您的嵌入式文档?

看到这个答案:

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

答案 3 :(得分:0)

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

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

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