如何使用串联作为 MongoDB $in 运算符的字段名称?
How to use a concatenation as the field name for the MongoDB $in operator?
假设我有一个姓名列表并且想要匹配不属于它的文档:
{ 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"]
]
}
}
}
}
])
假设我有一个姓名列表并且想要匹配不属于它的文档:
{ 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"]
]
}
}
}
}
])