【问题标题】:Find all objects with values for keys except duplicates查找具有键值的所有对象(重复项除外)
【发布时间】:2020-02-04 08:41:49
【问题描述】:

如果我有一个具有这种结构的数据库

{
_id: int
P1: string
P2: [{
    _id: int
    C1: [int]
    C2: int
    C3: string
    C4: string
    C5: [{
        D1: string
        D2: {E1: string}
    }]
    C6: string
    C7: false
}]
}

对于所有的P2对象,我们在C5中检查重复的D1值,只得到不重复的P2对象。

{_id:1, P1: "A", P2[{_id: 1, C1:[1], C2:1, C3:"X", C4:"B", C5[{D1:"123", D2:{E1: "331"}}], C6:"Ex", C7:true}]}
{_id:1, P1: "A", P2[{_id: 2, C1:[1], C2:1, C3:"Y", C4:"U", C5[{D1:"456", D2:{E1: "332"}}], C6:"Ea", C7:false}]}
{_id:2, P1: "Z", P2[{_id: 3, C1:[1], C2:2, C3:"I", C4:"O", C5[{D1:"789", D2:{E1: "333"}}], C6:"Eq", C7:false}]}
{_id:2, P1: "Z", P2[{_id: 4, C1:[1], C2:2, C3:"P", C4:"L", C5[{D1:"123", D2:{E1: "334"}}], C6:"Ee", C7:true}]}

因此,当构造如下DB结构时,我想要这个结果。

{_id:1, P1: "A", P2[{_id: 1, C1:[1], C2:1, C3:"X", C4:"B", C5[{D1:"123", D2:{E1: "331"}}], C6:"Ex", C7:true}]}
{_id:1, P1: "A", P2[{_id: 2, C1:[1], C2:1, C3:"Y", C4:"U", C5[{D1:"456", D2:{E1: "332"}}], C6:"Ea", C7:false}]}
{_id:2, P1: "Z", P2[{_id: 3, C1:[1], C2:2, C3:"I", C4:"O", C5[{D1:"789", D2:{E1: "333"}}], C6:"Eq", C7:false}]}

我搜索了distinctaggregate 函数,但没有得到想要的结果。

【问题讨论】:

  • 那么对于每个D1,您想要第一个P2 对象吗?
  • @tomslabbaert 我想获取除 P2 中所有对象的重复 D2 值之外的其余 P2 对象。
  • 那么为什么不返回示例中的最后一个文档?它是一个不同的对象{_id: 4, C1:[1], C2:2, C3:"P", C4:"L", C5[{D1:"123", D2:{E1: "334"}}], C6:"Ee", C7:true}]
  • @tomslabbaert 我已经证明,因为 D1 值是重复的,所以它们被排除在结果之外。
  • 因此,对于每个 D1,您都需要第一个 P2 对象,正如我在第一条评论中所说的那样

标签: sql mongodb


【解决方案1】:

听起来像一个简单的$unwind$group 阶段就足够了:

db.collection.aggregate([
    {
        $unwind: "$P2"
    },
    {
        $group: {
            _id: "$P2"
        }
    },
    {
        $replaceRoot: {
            newRoot: "$_id"
        }
    }
])

如果您有更具体的要求,请尝试提供更深入的解释或在示例输出中添加独特的案例。

【讨论】:

  • 我们添加了比上一个更多的代码。请检查一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 2012-12-12
相关资源
最近更新 更多