[英]Mongoose query into an embedded document
我用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);
有任何Schema错误吗? 知道我做错了什么吗?
非常感谢你,
路易斯卡帕。
[更新]
我试过你的建议,但没办法。 我认为只有两种选择:
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不会返回空响应,结果为零。 相反,它通过等待和等待响应来维护应用程序,并且永远不会进入回调函数。
有任何想法吗? 你有类似的经历吗?
非常感谢!
解决
这是Mongoose的查询性能错误。 我有一个包含大约100K文件的测试集合,执行查询,我没有用'lang'和'content.link'定义复合索引。 查询延迟太多,Mongoose或MongoDB没有提醒任何超时警告或错误消息。 定义复合索引后,查询工作正常但是......
查询工作正常,可以在MongoDB shell中执行它们。 我不知道为什么Mongoose太慢了。 也许序列化 - 反序列化 - 验证所涉及的过程会产生延迟。
即使没有定义任何索引,我也不能相信这个简单的查询具有如此差的性能,只有100K文档的简单测试集合。 MongoDB本身消耗了大量资源来快速处理查询和响应。 老实说,我对MongoDB的预期更多 - Mongoose。
我的建议/意见:
注意索引配置。
如果您想快速搜索,请查看任何Node.js Apache Solr模块。
在第一个查询中,链接属性不在文档的“根”,您要搜索“content.link”而不是“link”(我不知道当前的猫鼬版本是否支持“。 “在嵌入式文档中查找内容
你不想要吗?
NewsModel.find({'lang':'en', 'content.link':'test'}).exec(callback);
查询您的嵌入式文档?
看到这个答案:
NewsModel.find({'lang':'en', 'content.link':'test'}).exec(callback);
可能试图找到一个名为'content.link'而不是'content'的字段,试试
NewModel.where('lang').equals('en')
.where('content').link.equals('test')
.exec(callback)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.