【问题标题】:How to return a document from MongoDB with given fields lowercased?如何从给定字段小写的 MongoDB 返回文档?
【发布时间】:2014-03-12 03:03:46
【问题描述】:

我正在使用 PHP 的 Mongo 扩展。

我在 MongoDB 中有一个两级文档的集合,每个文档在第二级都有一个“电子邮件”字段(即“user_data.email”字段)。我想要一个MongoCursor 加载文档,每个文档都有这个字段小写。这可能吗?

数据集是约 100000 个文档,我已经分析了我的应用程序,并且知道在 PHP 端超过结果的strtolower() 是一个瓶颈。

【问题讨论】:

    标签: php mongodb mongodb-query aggregation-framework data-conversion


    【解决方案1】:

    有点痛。也许mapReduce

    db.collection.mapReduce(
        function() {
            emit( this._id, values: {
                email: this.user_data.email.toLowerCase(),
                other: this.other_field.toLowerCase()
            });
        },
        function(){},
        {
            "out": { "replace": "newCollection" }
        }
    )
    

    然后使用.find() 从新集合中获取结果。

    或者您可以等待 2.6,aggregate 确实返回光标

    db.collection.aggregate([
        { "$project": { "email": { "$toLower": "$user_data.email" } } }
    ])
    

    真的不确定您的用例。电子邮件不区分大小写,因此任何匹配都应考虑到这一点。

    但如果你喜欢比较,为什么不使用strcasecomp

    归根结底,这可能是您应该在数据中更新的内容,然后确保始终使用电子邮件地址插入记录小写。

    【讨论】:

    • 是的,已经考虑过 MapReduce,但问题是,我可能需要的不仅仅是该文档中的电子邮件字段。 :-/
    • 对于用例 - 我们将来自 MongoDB 的电子邮件与来自其他数据源的电子邮件进行比较。因此,PHP 会进行比较,我正在尝试减少这方面的负载。
    • @hijarian 这很简单。只需发出一个“文档”作为值。你需要这个例子吗?
    • @hijarian 和 comparison 有一个功能。请参阅答案中的编辑。
    • 嗯...比较部分是另一个问题,真的... :) 简而言之,最后我需要来自 MySQL 的电子邮件列表过滤的来自 MongoDB 的电子邮件列表。为了避开 n^2 算法,我将 MySQL 数据中的所有值加载为 PHP 数组的键,然后使用array_key_exists 进行比较。它肯定是区分大小写的。问题是,MongoDB 和 MySQL 中的电子邮件 在不同的情况下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2014-11-12
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2016-09-27
    • 2017-03-28
    相关资源
    最近更新 更多