簡體   English   中英

Mongoose查詢到嵌入式文檔

[英]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沒有提醒任何超時警告或錯誤消息。 定義復合索引后,查詢工作正常但是......

  1. 查詢工作正常,可以在MongoDB shell中執行它們。 我不知道為什么Mongoose太慢了。 也許序列化 - 反序列化 - 驗證所涉及的過程會產生延遲。

  2. 即使沒有定義任何索引,我也不能相信這個簡單的查詢具有如此差的性能,只有100K文檔的簡單測試集合。 MongoDB本身消耗了大量資源來快速處理查詢和響應。 老實說,我對MongoDB的預期更多 - Mongoose。

我的建議/意見:

注意索引配置。

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

在第一個查詢中,鏈接屬性不在文檔的“根”,您要搜索“content.link”而不是“link”(我不知道當前的貓鼬版本是否支持“。 “在嵌入式文檔中查找內容

你不想要嗎?

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

查詢您的嵌入式文檔?

看到這個答案:

通過Mongoose,Node.js,MongodDB中的特定屬性查找嵌入式文檔

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM