【问题标题】:MongoDB like statement with multiple fields具有多个字段的类似 MongoDB 的语句
【发布时间】:2014-11-06 14:03:54
【问题描述】:

使用 SQL 我们可以做到以下几点:

select * from x where concat(x.y ," ",x.z) like "%find m%"

当 x.y = "find" 和 x.z = "me"。

我如何使用 MongoDB 做同样的事情,当我使用类似于这样的 JSON 结构时:

{
  data:
  [
     {
         id:1,
         value : "find"
     },
      {
         id:2,
         value : "me"
     }
  ]
}

【问题讨论】:

  • 没有与“x.y”或“x.z”对应的字段和完全无效的结构。有点厌倦了“在 SQL 中我们可以做到……”的问题。特别是当没有本例中的逻辑结构时。问一个更好的问题。
  • @NeilLunn 请解释一下你不明白的地方,我可以更好地解释自己。仅仅因为您“厌倦”了某些类型的问题,所以将问题排名降低并不是一个很好的理由。我敢肯定,不止一个人在为这类问题苦苦挣扎。
  • 天哪。编辑后的结构至少是有效的。但我在这里看到的只是“data.value”的通用路径。几乎没有你描述的“x.y”“x.z”。不要把它当作我的问题。向需要帮助的人解释自己是你的工作。否则你不需要问你是否知道答案。顺便提一句。花时间提示你“做得更好”的人,通常不是“给你下级”的人。所以下车吧。你问了一个不好的问题。有人为此对你投了反对票。做得更好。

标签: sql mongodb mongodb-query sql-like


【解决方案1】:

这里与 SQL 的比较是无效的,因为没有任何关系数据库具有与 MongoDB 相同的嵌入式数组概念,并且在您的示例中提供。您只能在表格的“行中的字段”之间“连接”。基本上不是一回事。

您可以通过 $where 的 JavaScript 评估来做到这一点,这不是最佳的,但它是一个开始。您也可以谨慎地为比赛添加一些额外的“智能”:

db.collection.find({
    "$or": [
        { "data.value": /^f/ },
        { "data.value": /^m/ }
    ],
    "$where": function() {
        var items = [];
        this.data.forEach(function(item) {
            items.push(item.value);
        });
        var myString = items.join(" ");

        if ( myString.match(/find m/) != null )
            return 1;
    }
})

所以你去。我们通过从每个单词中的“测试字符串”中提取第一个字符并将标记与文档中数组的每个元素进行比较来对此进行了一些优化。

下一部分将数组元素“连接”成一个字符串,然后对连接的结果进行“正则表达式”比较(与“like”相同)以查看它是否匹配。如果匹配,则文档被视为匹配并返回。

不是最优的,但这些是 MongoDB 在这样的结构上可用的选项。也许结构应该不同。但是您没有具体说明为什么要这样做,因此我们无法为您想要实现的目标提供更好的解决方案。

【讨论】:

    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 2015-03-12
    • 2020-12-08
    • 1970-01-01
    相关资源
    最近更新 更多