【问题标题】:Find non-duplicate objects that meet certain conditions查找满足特定条件的非重复对象
【发布时间】:2020-05-20 21:31:35
【问题描述】:

我有这个数据库结构...

{
_id: int
A1: string
A2: [{
    _id: int
    B1: [int]
    B2: int
    B3: string
    B4: string
    B5: [{
        C1: string
        C2: {D1: string}
    }]
    B6: string
    B7: false
}]
}

而且数据是这样的。

{_id:1, A1: "A", A2[{_id: 1, B1:[1], B2:1, B3:"X", B4:"B", B5[{C1:"123", C2:{D1: "331"}}], B6:"Ex", B7:true}]}
{_id:1, A1: "A", A2[{_id: 2, B1:[1], B2:1, B3:"Y", B4:"U", B5[{C1:"456", C2:{D1: "332"}}], B6:"Ea", B7:false}]}
{_id:2, A1: "Z", A2[{_id: 3, B1:[1], B2:2, B3:"I", B4:"O", B5[{C1:"789", C2:{D1: "333"}}], B6:"Eq", B7:false}]}
{_id:2, A1: "Z", A2[{_id: 4, B1:[1], B2:2, B3:"P", B4:"L", B5[{C1:"123", C2:{D1: "334"}}], 6:"Ee", B7:true}]}

所以我想这样拉数据。

{_id:1, A1: "A", A2[{_id: 1, B1:[1], B2:1, B3:"X", B4:"B", B5[{C1:"123", C2:{D1: "331"}}], B6:"Ex", B7:true}]}
{_id:1, A1: "A", A2[{_id: 2, B1:[1], B2:1, B3:"Y", B4:"U", B5[{C1:"456", C2:{D1: "332"}}], B6:"Ea", B7:false}]}
{_id:2, A1: "Z", A2[{_id: 3, B1:[1], B2:2, B3:"I", B4:"O", B5[{C1:"789", C2:{D1: "333"}}], B6:"Eq", B7:false}]}

也就是说,我想检查A2数组中的文档中C1的值是否重复,并获取A2数组中除了重复值之外的其余文档。

【问题讨论】:

  • 所给出的样本是否取自任何聚合的中间?如果不是,您如何从多个文档中获得相同的_id?是错字吗?
  • @whoami 没有错字。我找到A2数组中的所有对象,但是如果有C2的重复,我想只带其中一个。

标签: sql database mongodb


【解决方案1】:

以下是对此的查询

//Populate the data
db.sample.insert({_id:1, A1: "A", A2:[{_id: 1, B1:[1], B2:1, B3:"X", B4:"B", B5:[{C1:"123", C2:{D1: "331"}}], B6:"Ex", B7:true}]})
db.sample.insert({_id:2, A1: "A", A2:[{_id: 2, B1:[1], B2:1, B3:"Y", B4:"U", B5:[{C1:"456", C2:{D1: "332"}}], B6:"Ea", B7:false}]})
db.sample.insert({_id:3, A1: "Z", A2:[{_id: 3, B1:[1], B2:2, B3:"I", B4:"O", B5:[{C1:"789", C2:{D1: "333"}}], B6:"Eq", B7:false}]})
db.sample.insert({_id:4, A1: "Z", A2:[{_id: 4, B1:[1], B2:2, B3:"P", B4:"L", B5:[{C1:"123", C2:{D1: "334"}}], 6:"Ee", B7:true}]})

db.sample.aggregate([
{$group:{_id:'$A2.B5.C1',docs:{$addToSet:'$$CURRENT'}}},//here we have grouped using the C1 field
{$replaceRoot:{newRoot:{$arrayElemAt:['$docs',0]}}}//as you need only the first doc, arrayElemAt is used to take first doc and replaced to root
])

【讨论】:

    猜你喜欢
    • 2018-07-27
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2014-08-29
    • 2011-05-12
    相关资源
    最近更新 更多