查找具有键值的所有对象(重复项除外)

Posted

技术标签:

【中文标题】查找具有键值的所有对象(重复项除外)【英文标题】: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 对象,正如我在第一条评论中所说的那样 【参考方案1】:

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

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

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

【讨论】:

我们添加了比上一个更多的代码。请检查一次。

以上是关于查找具有键值的所有对象(重复项除外)的主要内容,如果未能解决你的问题,请参考以下文章

在具有显式键值的对象列表中查找元素

multimap容器怎么查找多个具有相同键值的数据?

排序具有指定键值的数组PHP [重复]

检查对象数组中是不是存在具有特定键值的对象

删除嵌套数组中具有键值的对象

在 JavaScript 中获取具有键值的对象数据