查找具有键值的所有对象(重复项除外)
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]
我搜索了distinct
和aggregate
函数,但没有得到想要的结果。
【问题讨论】:
那么对于每个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"
])
如果您有更具体的要求,请尝试提供更深入的解释或在示例输出中添加独特的案例。
【讨论】:
我们添加了比上一个更多的代码。请检查一次。以上是关于查找具有键值的所有对象(重复项除外)的主要内容,如果未能解决你的问题,请参考以下文章