gpt4 book ai didi

MongoDB 获取唯一文档,需要与同一集合中的其他文档进行比较

转载 作者:可可西里 更新时间:2023-11-01 10:42:40 27 4
gpt4 key购买 nike

下面是我在测试集合中的示例文档结构。

问题描述:

我必须根据以下条件从该文档中获取 name 字段。

我将传递 role 字段作为查询条件。它应该获取与文档中的 role 无关的 name 值。

请考虑以下文档。如果我的查询条件是角色 r1,则查找查询应返回如下名称:

{"name":"S"},{"name":"G"}, {"name":"H"}

因为 r1 没有分配给集合中任何文档中的这个名称。

相同的规则适用于所有角色,如 r2r3...r7。所以基本上我们必须查找集合中的所有文档,并且需要获取未分配给任何组的名称。

/* 0 */
{
"_id" : ObjectId("567286bda5543ad892916a49"),
"name" : "A",
"role" : "r1"
}

/* 1 */
{
"_id" : ObjectId("567286bda5543ad892916a4a"),
"name" : "A",
"role" : "r2"
}

/* 2 */
{
"_id" : ObjectId("567286bda5543ad892916a4b"),
"name" : "A",
"role" : "r3"
}

/* 3 */
{
"_id" : ObjectId("567286bda5543ad892916a4c"),
"name" : "B",
"role" : "r2"
}

/* 4 */
{
"_id" : ObjectId("567286bda5543ad892916a4d"),
"name" : "A",
"role" : "r4"
}

/* 5 */
{
"_id" : ObjectId("567286bda5543ad892916a4e"),
"name" : "B",
"role" : "r1"
}

/* 6 */
{
"_id" : ObjectId("5672a8b7a5543ad892916a4f"),
"name" : "S",
"role" : "r3"
}

/* 7 */
{
"_id" : ObjectId("5672a8b7a5543ad892916a50"),
"name" : "G",
"role" : "r6"
}

/* 8 */
{
"_id" : ObjectId("5672a8b7a5543ad892916a51"),
"name" : "H",
"role" : "r2"
}

预期输出:

-- input is role `r1` then (Need to show the name if `r1` is not associate already) -- same description for all the roles

{"name" : "S"},
{"name" : "G"},
{"name" : "H"}

-- input is role 'r2' then

{"name" : "S"},
{"name" : "G"}

-- input is role 'r3' then

{"name" : "B"},
{"name" : "G"},
{"name" : "H"}

-- input is role 'r4' then

{"name" : "B"},
{"name" : "S"},
{"name" : "G"},
{"name" : "H"}

-- input is role 'r6' then

{"name" : "A"},
{"name" : "B"},
{"name" : "S"},
{"name" : "H"}

非常感谢任何帮助。如何实现这个。聚合框架或正常查找查询?请指教。

最佳答案

我找到了比已接受的答案更好的方法来获得此结果,而且我认为性能会更好。只需检查一下:

 db.collection.aggregate([
{
$group: { _id: null,
rightrole: { $addToSet: { $cond : {if: { $ne: [ "$role", "r1" ] }, then: "$name", else: null }} },
wrongrole: { $addToSet: { $cond : {if: { $eq: [ "$role", "r1" ] }, then: "$name", else: null } } } }
},
{ "$project": {"_id": 0,
"name": { "$setDifference": [ "$rightrole", "$wrongrole" ] } }
}, {$unwind: "$name"}
]);
  1. 找到不属于当前角色的名字列表并添加到一个数组。
  2. 查找当前角色中的名称列表并将其添加到数组中。
  3. 找出两个数组之间的差异使用 $setDifference 运算符。
  4. 展开名称

关于MongoDB 获取唯一文档,需要与同一集合中的其他文档进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34347841/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com