MongoDB에서 내부 어레이 크기를 쿼리하는 중
의 MongoDB 문서를 고려합니다.users
컬렉션:
{ username : 'Alex', tags: ['C#', 'Java', 'C++'] }
길이를 알 수 있는 방법이 있습니까?tags
(클라이언트에게 태그를 전달하지 않고) 서버 측에서 배열하시겠습니까?
감사해요!
사용자 이름 Alex가 고유한 경우 다음 코드를 사용할 수 있습니다.
db.test.insert({username:"Alex", tags: ['C#', 'Java', 'C++'] });
db.test.aggregate(
{$match: {username : "Alex"}},
{$unwind: "$tags"},
{$project: {count:{$add:1}}},
{$group: {_id: null, number: {$sum: "$count" }}}
);
{ "result" : [ { "_id" : null, "number" : 3 } ], "ok" : 1 }
이제 MongoDB(2.6 릴리즈)는 $size
집계 작업
설명서에서 다음을 참조하십시오.
{ <field>: { $size: <array> } }
다음 중 하나를 사용하여 원하는 작업을 수행할 수 있습니다.
db.users.aggregate(
[
{
$group: {
_id: "$username",
tags_count: {$first: {$size: "$tags" }}
}
}
]
)
또는
db.users.aggregate(
[
{
$project: {
tags_count: {$size: "$tags"}
}
}
]
)
$inc를 사용하거나 일정에 따라 작업을 통해 각 저장(별도 필드)의 태그 수를 계산하는 것이 더 효율적일 수 있다고 생각합니다.
지도/축소(표준 예제)로도 이 작업을 수행할 수 있지만 원하는 것은 아닌 것 같습니다.
요청하신 대로 정확히 할 수 있을지는 모르겠지만, $size로 특정 크기와 일치하는 모든 문서를 조회할 수 있습니다.
> db.collection.find({ tags : { $size: 3 }});
그러면 3개의 태그가 있는 모든 문서를 얻을 수 있습니다.
xmm.dev의 답변은 단순화할 수 있습니다. 용어 필드 'count' 대신 $group:
db.test.aggregate(
{$match: {username : "Alex"}},
{$unwind: "$tags"},
{$group: {_id: null, number: {$sum: 1 }}}
)
현재, 그것을 할 수 있는 유일한 방법은db.eval
그러나 다른 작업을 위해 데이터베이스를 잠급니다.
가장 속도 효율적인 방법은 배열 길이를 저장하는 추가 필드를 추가하고 $inc 및 $push 작업을 통해 이를 유지하는 것입니다.
어레이 크기를 쿼리하고 0보다 크지만 1-3 사이일 수 있으면 반환해야 하기 때문에 작은 작업을 수행했습니다.
제 해결책은 다음과 같습니다.
db.test.find($or : [{$field : { $exists : true, $size : 1}},
{$field : { $exists : true, $size : 2}},
{$field : { $exists : true, $size : 3}}, ])
속성이 존재하고 크기가 1, 2 또는 3인 경우 기본적으로 문서를 반환합니다.사용자는 특정 크기 또는 범위 내에서 원하는 경우 더 많은 문을 추가하고 증분할 수 있습니다.완벽하지는 않지만 효과가 있고 비교적 빠릅니다.속성에 1-3개의 크기밖에 없었기 때문에 이 솔루션이 작동했습니다.
언급URL : https://stackoverflow.com/questions/6722850/querying-internal-array-size-in-mongodb
'programing' 카테고리의 다른 글
UI 테이블 보기를 길게 누릅니다. (0) | 2023.06.01 |
---|---|
테이블 크기 조정 방법UI 테이블 뷰의 머리글 뷰? (0) | 2023.06.01 |
ASP.NET 코어 웹 API 인증 (0) | 2023.06.01 |
웹 애플리케이션이 iOS 기기에 푸시 알림을 보내는 방법은 무엇입니까? (0) | 2023.06.01 |
배열을 하나의 문자열로 결합하는 루비 (0) | 2023.06.01 |