MongoDB like语句有多个字段

时间:2014-11-06 14:03:54

标签: sql mongodb mongodb-query sql-like

使用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"
     }
  ]
}

1 个答案:

答案 0 :(得分:0)

此处与SQL的比较无效,因为没有关系数据库具有与MongoDB相同的嵌入式数组概念,并且在您的示例中提供。你只能" concat"在"行之间的字段"一张桌子。基本上不是一回事。

您可以使用$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;
    }
})

所以你去吧。我们通过从你的"测试字符串"中取出第一个字符来优化这一点。在每个单词中,将标记与文档中数组的每个元素进行比较。

下一部分"连接"将数组元素转换为字符串,然后执行"正则表达式"在连接结果上进行比较(与#34;喜欢"相同)以查看它是否匹配。如果它出现,那么该文件被认为是匹配并返回。

不是最优的,但这些是MongoDB在这样的结构上可用的选项。也许结构应该是不同的。但是你没有说明你为什么要这样做,所以我们不能建议你想要达到的目标更好的解决方案。