有没有办法在MongoDB上做类似的事情?

select * from table where concat(field1, field2) = 'value'

为了澄清,我有一个全名数组,但是文件的名字和姓氏是分开的,所以我想做一些类似的事情:

select * from table where concat(firstname, lastname) in ([ARRAY OF NAMES])

推荐答案

您只能使用聚合框架,而不能使用常规查找.

db.coll.aggregate({$project:{newField:{$concat:["$field1","$field2"]}}},
                  {$match:{newField:"value"}} 
);

请注意,这将无法使用任何索引,因为MongoDB(尚未)中不支持计算值的索引.

如果索引为field1,并且知道field1将为value贡献多少个字符,则可以通过如下方式改进此聚合的性能:

db.coll.aggregate({$match:{field1:/^val/}},
                  {$project:{newField:{$concat:["$field1","$field2"]}}},
                  {$match:{newField:"value"}} 
);

其中,val是"value"字符串的第一部分(但比较的字符数不能超过最短值field1).

EDIT从3.6版开始,您可以使用$expr表达式在find中执行此操作:

db.coll.find({$expr:{$eq:["value", {$concat:["$field1", "$field2"]}]}})

Mongodb相关问答推荐

如何从文档列表的数组内部打印一个对象?

MongoDB合并按键更新值的对象数组

mongodb.将文档分组在数组中,对它们进行评分计数和求和并添加新字段

随着时间的推移在 mongodb 中获得

使用 mongo-driver/mongo 使用键/值对中的值表达式查找文档

有谁知道这个错误的修复方法(TypeError: Cannot assign to read only property ‘map’ of object '#')

无法让 Mongoose.js 子文档数组填充

findOneAndUpdate 和 findOneAndReplace 有什么区别?

更新 MongoDB 中嵌套实体数组中的属性

NoSql 参考数据

如何返回 MongoDB 中文档的 ObjectId 或 _id?和错误$in 需要一个数组

适用于 Windows 10 64 位的 MongoDB 下载

MongoDB 查找精确的数组匹配,但顺序无关紧要

如何使用 mgo 和 Go 查询 MongoDB 的日期范围?

MongoDB 查询:字段不存在或具有特定值

spring 数据MongoDB.生成id的错误

是否可以在 Mongodb 中的两个数据库之间进行 $lookup 聚合?

对于社交网站(使用 Ruby on Rails 开发)来说,MongoDB 会是一个好主意吗?

带有条件的MongoDB聚合查找

MongoDB Compass:select distinct field values