对于令人困惑的标题,我不确定如何总结这一点。
假设我在集合中有以下文档列表:
{ "name": "Lorem", "source": "A" }
{ "name": "Lorem", "source": "B" }
{ "name": "Ipsum", "source": "A" }
{ "name": "Ipsum", "source": "B" }
{ "name": "Ipsum", "source": "C" }
{ "name": "Foo", "source": "B" }
以及接受源的有序列表,其中较低的索引表示较高的优先级
sources = ["A", "B"]
我的查询应该:
- 列出可用来源和通缉名称列表
- 每个名称最多返回一个文档。
- 如果有多个匹配项,则应选择具有最高优先级来源的文档。
例:
wanted_names = ['Lorem', 'Ipsum', 'Foo', 'NotThere']
结果:
{ "name": "Lorem", "source": "A" }
{ "name": "Ipsum", "source": "A" }
{ "name": "Foo", "source": "B" }
结果不一定必须排序。
是否可以仅使用Mongo查询来执行此操作?如果是这样,有人可以指出我一个详细说明如何完成它的资源吗?
我当前的解决方案不支持名称列表,而是依靠 Python 脚本来执行多个查询:
db.collection.aggregate([
{$match: {
"name": "Lorem",
"source": {
$in: sources
}}},
{$addFields: {
"order": {
$indexOfArray: [sources, "$source"]
}}},
{$sort: {
"order": 1
}},
{$limit: 1}
]);
注意:为简洁起见,本问题省略了_id
字段
这个怎么样:有了$group
,我们就有了$min
运算符,它占用较低的源代码
注意:如果优先级为 ["B"、"A"],请使用$max
db.collection.aggregate([
{
$match: {
"name": {
$in: [
"Lorem",
"Ipsum",
"Foo",
"NotThere"
]
},
"source": {
$in: [
"A",
"B"
]
}
}
},
{
$group: {
_id: "$name",
source: {
$min: "$source"
}
}
},
{
$project: {
_id: 0,
name: "$_id",
source: 1
}
}
])
蒙戈游乐场