如何解决如何使用串联作为MongoDB $ in运算符的字段名称?
假设我有一个名称列表,并且想匹配不属于该名称的文档:
{ firstname: { $not: { $in: ["Alice","Bob"] } } }
但是现在我必须匹配名字+姓氏(即给定的列表为["Alice Smith","Bob Jones"]
)。
我知道我可以很容易地将两个字段连接起来,像这样:
{ $concat: ["$firstname"," ","$lastname"] }
但是如何像在这里使用firstname
一样在初始查询中使用这个新的“字段”?显然,我不能只用此表达式替换对象键。
This answer非常接近,但是不幸的是,它缺少最后一条信息,该信息关于一个人如何在$in
上下文中使用该解决方案。而且,由于我认为这是一个普遍使用的问题,但无法找到任何相关信息(至少使用我使用的搜索字词),因此我打开了这个单独的问题。
编辑:如果可能,我想避免使用聚合。我要查找的查询应该用作the Node driver's deleteMany
method的filter
参数。
解决方法
确实,你真的很亲近。
您必须使用汇总。这是一个“阶段”序列,在每个阶段中,您可以转换数据并将结果传递到下一个阶段。
这是一个解决方案;试试Here
使用$project
,我用您的full_name
创建一个新字段$concat
然后使用$match
,我使用您的条件{ firstname: { $not: { $in: ["Alice","Bob"] } } }
,但我将其应用于新创建的full_name
您可以在mongoplayground中删除$match
并查看其作用。
PS:有一个mongo运算符$nin
执行$not
和$in
db.collection.aggregate([
{
"$project": {
"full_name": {
$concat: [
"$firstname"," ","$lastname"
]
}
}
},{
$match: {
full_name: {
$nin: [
"Alice In wonderland","Bob Marley"
]
}
}
}
])
,
您可以使用$expr
,但不等于使用$not
外侧的$in
,
db.collection.aggregate([
{
$match: {
$expr: {
$not: {
$in: [
{ $concat: ["$firstname","$lastname"] },["Alice In wonderland","Bob Marley"]
]
}
}
}
}
])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。