【问题标题】:need guidance on node.js multilingual presentation需要有关 node.js 多语言演示的指导
【发布时间】:2014-09-23 23:15:29
【问题描述】:

我是节点 (v0.10) 堆栈的新手。 我正在努力实现以下目标:

我在最新的 MongoDB 中有(希望)多语言文章,例如:

_id
...more fields...
text: [
{lang: 'en', title: 'some title', body: 'body', slug: 'slug'},
....
]

每次我以特定语言显示文章时,我都会查询如下:

var query = Model.findOne({'text.slug': slug});
query.exec(function(err, doc){
async.each(doc.text, function(item, callback){
    if (item.lang == articleLang) {
        //populate the article to display
    }
});

res.render('view', {post:articleToDisplay});
});

Slug 对于每种语言都是独一无二的! 我遇到的问题是 mongo 将返回包含所有子文档的整个文档,而不仅仅是我搜索的子文档。现在我必须选择遍历所有子文档并在客户端显示适当的子文档,或者在服务器上使用 async.each 来获取我需要的子文档并仅发送到那个视图。我在服务器上使用异步进行。那样行吗? async 也异步迭代,但节点仍然等待整个循环完成,然后渲染视图。我是否错过了任何认为用户实际上被阻止直到 async.each 完成的东西?我仍在尝试围绕这种异步执行进行思考。有没有办法可以改进我管理此代码的方式?这似乎是子文档的标准程序!

提前感谢您的帮助。

【问题讨论】:

    标签: node.js mongodb asynchronous


    【解决方案1】:

    要实现你想要的,你需要使用aggregation pipeline。使用简单的findOne() 将无济于事, 因为你必须在你的代码中编辑子文档,而不是让 mongodb 来做。 find()findOne() 返回整个文档 文档符合搜索条件。

    在聚合管道中,您可以使用 $unwind$match 运算符来实现此目的。

    $unwind: 
    

    从输入文档中解构一个数组字段以输出一个 每个元素的文档。每个输出文档都是输入文档 将数组字段的值替换为元素。

    首先根据text 值数组展开文档。

    $match:
    

    过滤文档以仅传递匹配的文档 指定条件到下一个管道阶段。

    然后使用$match 运算符来匹配相应的文档。

    db.Model.aggregate([
    {$unwind:"$text"},
    {$match:{"text.slug":slug,"text.lang":articleLang}}
    ])
    

    这样做只会返回一个文档,其text 字段仅包含一个对象。如:(注意输出中的text字段不是数组)

    { "_id" : ... ,.., "text" : { "slug" : "slug", "lang" : "en" ,...} }
    

    【讨论】:

    • 谢谢!。如果您能回答我的问题,async.each 是否会阻止应用程序,直到所有选项都被迭代,这将构成接受这个作为答案。
    • 是的,这仍然意味着您正在异步而不是顺序地迭代所有数组项。 sebastianseilund.com/nodejs-async-in-practice - 更好地理解异步是如何工作的。 async.each().. 仍然会异步执行。但是只有在所有任务完成后才能恢复控制权,即迭代所有单独的文本字段,也就是在渲染视图时。相反,您可以设置一些变量来识别您的匹配已找到,然后调用最终回调或通过停止所有其他任务退出。
    • @sunlover: 上面回复的标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    相关资源
    最近更新 更多