根据字段在数组中的位置筛选 mongodb 查询结果



对于令人困惑的标题,我不确定如何总结这一点。

假设我在集合中有以下文档列表:

{ "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
}
}
])

蒙戈游乐场

最新更新