3

我用 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 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

4 回答 4

2

解决

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

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

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

我的建议/建议:

注意索引配置。

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

于 2012-09-03T11:37:29.197 回答
0

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

于 2012-08-31T15:12:50.907 回答
0

你不想

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

查询您的嵌入式文档?

看到这个答案:

通过 Mongoose、Node.js、MongodDB 中的特定属性查找嵌入式文档

于 2012-08-31T15:18:55.627 回答
0
NewsModel.find({'lang':'en', 'content.link':'test'}).exec(callback); 

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

NewModel.where('lang').equals('en')  
        .where('content').link.equals('test') 
        .exec(callback)
于 2012-08-31T16:22:39.563 回答