내 컬렉션의 모든 항목에 대해 교차하는 하위 컬렉션이있는 다른 항목의 수를 찾아야합니다. 예를 들어이 컬렉션이
[{id:1,"sub":[1, 2, 3]},
{id:2,"sub":[2, 3, 4]},
{id:3,"sub":[4, 5, 6],
{id:4,"sub":[7, 8, 9]}]
예상 결과는
[{id:1,"count":1},
{id:2,"count":2},
{id:3,"count":1},
{id:4,"count":0"}]
순수 MongoDB 쿼리 언어의 알고리즘으로 시작 : 각 문서에 초기 sub
배열과 다른 모든 sub
값 의 배열이 포함되도록 문서를 재구성해야 합니다. 이렇게하려면 $ unwind 와 함께 $ group 을 실행해야합니다 . 그러면 $ setIntersect를 사용 하여 $ map 을 실행하는 것이 쉬워집니다. $ filter 모든 비어 있고 자체 배열과 동일하며 $ size를 사용하여 크기를 가져옵니다.
db.collection.aggregate([
{
$group: {
_id: null,
current: { $push: "$$ROOT" },
all: { $push: "$sub" }
}
},
{
$unwind: "$current"
},
{
$project: {
id: "$current.id",
count: {
$size: {
$filter: {
input: {
$map: {
input: "$all",
in: { $setIntersection: [ "$$this", "$current.sub" ] }
}
},
cond: {
$and: [
{ $ne: [ "$$this", [] ] },
{ $ne: [ "$$this", "$current.sub" ]}
]
}
}
}
}
}
}
])
집계가 매우 복잡하기 때문에 C #에서 강력한 형식으로 실행하는 것은 의미가 없습니다. 할 수있는 일은 BsonDocument
클래스를 사용하여 다음과 같은 파이프 라인을 구축하는 것입니다.
var groupDef = new BsonDocument()
{
{ "_id", "" },
{ "current", new BsonDocument(){ { "$push", "$$ROOT" } } },
{ "all", new BsonDocument(){ { "$push", "$sub" } } },
};
var projectDef = BsonDocument.Parse(@"{
id: ""$current.id"",
_id: 0,
count: {
$size: {
$filter: {
input: {
$map: {
input: ""$all"",
in: {
$setIntersection: [
""$$this"",
""$current.sub""
]
}
}
},
cond: {
$and: [
{
$ne: [
""$$this"",
[]
]
},
{
$ne: [
""$$this"",
""$current.sub""
]
}
]
}
}
}
}
}");
var result = mongoDBCollection.Aggregate()
.Group(groupDef)
.Unwind("current")
.Project(projectDef)
.ToList();
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다