使用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"
}
]
}
答案 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在这样的结构上可用的选项。也许结构应该是不同的。但是你没有说明你为什么要这样做,所以我们不能建议你想要达到的目标更好的解决方案。