ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 419
Obunachilar
Ma'lumot yo'q24 soatlar
-17 kunlar
+230 kunlar
Postlar arxiv
1 419
# ืืืื ืืฉื ืืืงืจืจ
ืจืื ืืื ืฉืื ืืฆืืืืื ืืืืืช ืื ืืื ืงืืคืกืืืช ืคืืกืืืง ืฉืฉืืืืืช ืืืงืจืจ ืืืชืจ ืืื ืืื ืขื ืฉืืืจ ืื ืืคืฉืจ ืืืืื ืืช ืื ืฉืืฉ ืืคื ืื. ืืจืื ืืืืืืื ืื ืฉืืจืืื ืืืชืจ ืืืื ืฉืขืืช ืืชืื ืืืชื ืงืืคืกืช ืคืืกืืืง. ืืืื ืฉืืืืฆืข ืืื ืืืืง ืืืขื ืืื: ืื ืืคืขืืื ืฉืื ื ืืกืชืื ืขื ืืงืืคืกื ืืฉืืืืื ืขืืืื ืื ืืืฉ ืจืงืื ืืืชืืื ืื ืืืืื, ืืื ืืกืืฃ ืืืจื ืืื ืื ืืื ืืืจ ืืืฉื ืฉื ืืื ืืืื ืืื ืขืืืื ืฉืืืจ ืืช ืืงืืคืกื ืื ืื ืืืืข ืืืืื ืคืขื ืืืื ืื ื ืืืื ืืกืคืืง ืจืขื ืืฉืืื ืืืืื ืืืชื ...
ืืืืชืจ ืืื ืืชืื ืชืื ืฉืื ื ืืืืจ, ืืฉืืชืืืืื ืืืชืื ืงืื ืื ืืืืืื ื ืงืฉืจืื ืืืื ืืื ืืืืชื ืงืืคืกื ืฉืื ื ืืืืืง ืืืงืจืจ. ืืืงืื ืืืืืง ืืช ืื ืฉืื ืขืืื ืืืืชื ืจืืข ืื ืืขืืืคืื ืืืืฉืื ืขื ืืืชื ืงื ืืืฉืื ืฉืื ืืฆืืื ืืืื ืืช ืขืื ืืขืงืฃ ืงืื ืขื ืขืื ืคืืืขื ืงืื ื ืืืืฆืืขืื. ืื ืื ื ืืืืขืื ืฉืืขืชืื ืื ืืืืข ืืืฆื ืฉืืืจ ืื ืืคืฉืจ ืืชืืืง ืืืชื, ืืื ืืจืืข ืืืฆื ืื ืืื ืืจืืข ืืฆืจืื ืืืชืงืื ืขื ืืคืืฆ'ืจ.
ืื - ืืืืืง ืงืื ืฉืื ื ืืืจ ืฉืืืขืืื ืขืืื ืขืืื?
ืืืืืจ ืขืืฉืื ืื ืงืืืช ืืืชืืื?
ืืื ืืกืืืจืื ืืืืก ืืื ืืืจ? ืืืื ืืกืืืจืื ืืช ืื ืืขืฆืื?
ืื ืืืฉืืืื ืขื ืืคืืฆ'ืจ ืื ืืืฉืืืื ืืืกืืฃ ืืืจื ืฉื ื ืืืฆืืื ืืจืืคืงืืืจืื ื ืืืื ืื ืืืจ ืื ืืคืฉืจ ืืชืืืง ืืช ืืืืจ ืืืืฅ ืืขื ืง ืฉืื ืื ื ืงืืจืืื ืื ืงืื.
ืืจืื ืืืชืจ ืงื ืืืจืืง ืืช ืืืืื ืืืช ืืงืื ืืฉืืืืื ืืช ืืกืืื ืื ืืจืืฉืื ืื ืฉื ืืจืืงืืื. ืืืกืืจืงืฆืื ืืจืืขื ืื ืชืฉืชืคืจ ืคืืชืืื ืื ืืขืืืจ ืขืื ืฉืืืข, ืืืืคื, ืืื ืจืง ืชืืื ืืืชืจ ืืจืืขื ืื ืขืื ืืขืื ืงืื ืืืขืจืืช ืืืขืชืง ืืื ื ืืืฉืชืืฉ ืื. ืืฉืืืขืืื ืืืืจื ืฉืืชื ืืืืจืื? ืื ืืจืื ืืืชืจ ืงืฆืจ ืืฉืืืขืืื (ืื ืืชื ืืืจ ืืืืขืื ืื ืฆืจืื ืืื ืืช ืืื ืืืจื ืื ืืื ื ืืื ืืช ืืืชื), ืืืืืกืืื ืืืื ืืฉื ื ืืงืจืืื ืืืื ืืจืื ืืืชืจ ืืืื.
1 419
ื ืกื ืืืฆืื ืืื ืืฉื ืืช ืืช ืกืืจ ืืืืื ืืื ืืืฆืื ืืช ืืืฉืชืืฉ ืขื ืืื ืคืืืช ืืฉืืืืช ืคืชืืืืช, ืืื ืืืฆืื ืืช ืืืฉืชืืฉ ืขื ืืื ืืจืื ืืฉืืืืช ืกืืืจืืช.
## ืืฆืืจืช ืขื ื ืชืืืืช ืืื ืืชืืืืช ืืื ืืืฉืืืืช
ืืืืืื ืืืืจืื ื ืืคืืกื ืืืืืืื ืขืืื ืืืืชืจ ืืื ืืืืืืช ืืงืืช ืืช ืื ืืขืจืืื ืืฉืื ืฉื ืฉืืจ ืืชืืจ ืืขืจื ืืืืฆืืจ ืืื ืงืืืฆื ืืืช ืืืืื ืฉืืืืื ืืช ืืืื. ืื ืขืืืจ ืืฉืืฉ ืื ื ืืืฉื ืจืฉืืืช ืชืืืืช ืืื ืื ื ืจืืฆืื ืืืืฆืจ ืขื ื ืชืืืืช ืื ืคืฉืื ืืืฆืื ืืฆื ืฉื ืืืกื ืจืฉืืื ืฉื ืื ืืชืืืืช ืืืคืฉืจืืืช.
ื Pipeline ืืจืืฉืื ืืืงื ืืช ืฉืื tags ืืืืฆืื ืืช ืื ืืขืจืืื ืืืืฆื ืืืืขืจื ืืื ืฉื ืืื ืืฉืืง ืืืชื ืืืืฆืขืืช ืฉืื
unwind, ืืืจื ืื ืืื ืืืจืื ืืช ืืืื ืืงืืืฆืืช ืืื ืฉืืื ืื ืืืืื ืฉืืืจืชื - ืคืฉืื null. ืืืื ืื ืืื ืืื ืืื ืืืกืืืื ืืืื ื ืงืื ืจืง ืืกืื ืืื ืืชืืฆืื. ืืฉืื tags ืฉื ืืืชื ืืกืื ืืชืืฆืื ืืืื ืืช ืืชืืฆืื ืฉื ืคืงืืืช $addToSet, ืฉืืืงืืช ืืื ืืกืื ืืช ืฉืื tags ืฉืื ืืืืกืืคื ืืืชื ืืงืืืฆื:
db.collection.aggregate([
{
"$unwind": "$tags"
},
{
"$group": {
_id: null,
tags: {
"$addToSet": "$tags"
}
}
},
])
ืืชื ืืืืื ืื ืืฉืืง ืขื ืืฉืืืืชื ืืื:
https://mongoplayground.net/p/2sxnLVSARWl ื ืกื ืืืืจืื ืืช ื $unwind ืืชืจืื ืื ืืชื ืืฆืืืืื ืื ืืฉ ืื ืืงืจื.
ืืคืฉืจืืช ืฉื ืื ืืืืชืจ ืืืขืืื ืืื ืืืืกืืฃ ืืื ืชืืืช ืื ืืช ืืกืคืจ ืืืกืืืื ืฉืืชืืืืื ืืชืืืช ืื. ืืฉืืื ืื ืื ื ืืฉืชืืฉ ื tags ืืชืืจ ืืืืื ืืื ืฉืื ืืืกืืืื ืฉืืฉ ืืื ืืช ืืืชื ืชืืืช ืืืื ืืืืชื ืงืืืฆื, ืืืืกืืฃ ืืื ืฉืื ืืฉื count ืฉืืืื ืืช ืืกืคืจ ืืืกืืืื ืืงืืืฆื:
db.collection.aggregate([
{
"$unwind": "$tags"
},
{
"$group": {
_id: "$tags",
"count": {
"$count": {}
}
}
},
])
ืฆืจืื ืืืืื: ืืชืืืืจ ืฉื Aggregation Pipeline ืืื ืื ืืืื ืืืื ืจืืฉืื. ืืฉ ืืืื ืคืงืืืืช ืืืืจืืช ืืืช ืืคืขืืื ืืชื ืื ืืืฆืืื ืืืืืง ืืช ืืคืงืืื ืฉืืชื ืฆืจืืืื, ืืืคืขืืื ืฆืจืื ืืืฆืื ืืจืืื ืืฆืืจืชืืืช ืืื ืืืจืื ื Pipeline ืืืฆืข ืืืืืง ืืช ืืืืฉืื ืฉืจืืฆืื. ืืขืืืื, ืืืจื ืงืฆืช ืืืืื ืื ืืชื ืชืจืื ืฉ Pipelines ืืฆืืืืื ืืชืช ืคืืชืจืื ืื ืคืืืช ืืื (ืืืืื ืืคืขืืื ืงืฆืช ืืืชืจ ืืื) ื SQL.1 419
ืืืจื ืฉืืฉืื ืืจืืฉืื ืืกืชืืื ืืืฉ ืื ื ืืช ืืงืืืฆืืช ืืื ืื ืืืฉืื ืืฉืื ืืฉื ื ืฉืืืื ืคืงืืืช
$match. ืคืงืืื ืื ืืกื ื ืช ืืช ืืืกืืืื (ืืืืืจ ืืช ืืงืืืฆืืช) ืืคื ืืคืจืืืจ ืฉืงืืืื. ื Pipeline ืืืืืื ืืคืจืืืจ ืืื ืืืืืจ ืฉืืฉืื totalSaleAmount ืืืื ืืืื ืื ืฉืืื ื 100, ืืืื ืจืง ืืงืืืฆืืช ืฉืืชืืืืืช ืืืคืืขื ืืชืืฆืื. ืกื ืืื ืชืืฆืืช ื Pipeline ืชืืื:
{ "_id" : "abc", "totalSaleAmount" : NumberDecimal("170") }
{ "_id" : "xyz", "totalSaleAmount" : NumberDecimal("150") }
{ "_id" : "def", "totalSaleAmount" : NumberDecimal("112.5") }
ื ืืฉืื ืืขืื ืืื ืืืืืืืช ืืืคืขื ืขื ืืืกืฃ ื ืชืื ืื ืฉื ืืฉืืืืช.
## ืืฆืืจืช ืื ืชืื ืื
ืืื ืื ืชืื ืื ืืืืืื ื Collection ืฉืื. ืืฉ ืคื ืืฉืืืืช ืืืืฆืืข, ืืื ืืฉืืื ืืฉ ืกืืืืก (ืืฉืื done) ืืื ืืืฆืขื ืื ืื, ืืฉืชืืฉ ืฉืืืฉืืื ืืืขืืืชื, ืืงืกื ืฉื ืืืฉืืื ืืจืฉืืืช ืชืืืืช:
[
{
"key": 1,
text: "do it!",
done: false,
owner: "dan",
tags: [
"home"
],
},
{
"key": 2,
text: "do something else",
done: false,
owner: "mike",
tags: [
"home",
"work"
],
},
{
key: 3,
text: "fix stuff",
done: true,
owner: "mike",
tags: [
"home",
"garden"
],
},
{
key: 4,
text: "eat something",
done: false,
owner: "mike",
tags: [],
}
]
## ืกืคืืจืช ืืฉืืืืช ืคืชืืืืช ืฉื ืื ืืืฉืชืืฉืื
ืืฉืืื ืจืืฉืื ื ืืื ืืืฆืื ืืื ืืฉืืืืช ืคืชืืืืช ืืฉ ืกื ืืื ืืื ืฉืืฉืชืืฉืื ืืื. ืฉืชื ืืคืงืืืืช ืฉืืขืืจื ืื ื ืืื ืื $match ื $count: ืืจืืฉืื ื ืชืกื ื ืจืง ืืช ืืืฉืืืืช ืฉืขืืืื ืื ืืืฆืขื, ืืืฉื ืื ืชืกืคืืจ ืืื ืืฉืืืืช ืืืื ืืื.
ืื ื ืจืื ื Pipeline:
db.collection.aggregate([
{
$match: {
done: false
}
},
{
$count: "totalOpenTasks",
}
])
ืืื ืืชื ืจืืฆืื ืืฉืืง ืขื ืืงืื, ืืืจืืฅ ืืจื ืืืคืืคื ืื ืืฉื ืืช ืงืฆืช ืืืจืืืช ืืช ืืืคืงื ืืื ืชื ืืฃ ื Mongo Playground ืฉืืชืืื ืืืื ืืืื ืืื ืืงืืฉืืจ ืืื:
https://mongoplayground.net/p/QwZCzp4etfd
## ืกืคืืจืช ืืฉืืืืช ืคืชืืืืช ืฉื ืืฉืชืืฉ ืืกืืื
ืืื ืื ื ืจืฆื ืืืชืืื ืืช ืืฉืืืืชื ืจืง ืืืฉืชืืฉ ืืกืืื? ืืื ืงื ืืขืืื, ืจืง ืฆืจืื ืืฉื ืืช ืืช ืืชื ืื ื $match. ืื ืืจืื ืืงืื:
db.collection.aggregate([
{
$match: {
done: false,
owner: "dan",
}
},
{
$count: "dansOpenTasks",
}
])
ืืืื ืืฉ ืืช ื Mongo Playground ืืืชืืื ืื:
https://mongoplayground.net/p/s08WtYHrjbp
## ืืฆืืจืช ืืื: ืืื ืืฉืืืืช ืคืชืืืืช ืืฉ ืืื ืืฉืชืืฉ
ืืืื ื ืกืื ืงืฆืช ืืช ืืขื ืืื ืื ืื ืฉืื ืืื ืืฉืืืืช ืคืชืืืืช ืืฉ ืืื ืืื ืืืืฉืชืืฉืื ืืืขืจืืช. ืื ื ืืืืื ืืช ื Pipeline ืื ืืฉืืื ืืฉืืื ืืืืช ืฆืจืื ืืืืืืฃ ืืช ืืคืงืืื ืืฉื ืื, ืืืงืื ืืกืคืืจ ืืื ืืกืืืื ืงืืืื ื, ื ืจืฆื ืืงืืฅ ืืื ืืงืืืฆืืช ืืช ืืืฉืืืืช ืืคื ืฉืื owner (ืืืืืจ ืืคื ืืืฉืชืืฉ ืฉืืืฉืืื ืฉืืืืช ืื), ืืืกืคืืจ ืืื ืืกืืืื ืืฉ ืืื ืงืืืฆื ืืืืช. ืืชืืืืจ ืงืฆืช ืืกืืจืื ืืืื ื ืจืื ืื:
db.collection.aggregate([
{
$match: {
done: false,
}
},
{
$group: {
"_id": "$owner",
"openTasks": {
$count: {}
}
}
}
])
ืืคื ืืคืฉืจ ืืฉืืง ืขื ืืฉืืืืชื:
https://mongoplayground.net/p/7FhgRMgHFvE
## ืืืืื ืืืฉืชืืฉ ืขื ืืื ืืจืื ืืฉืืืืช ืคืชืืืืช
ืืืจื ืฉืืืืื ื ืืื ืืฉืืืืช ืคืชืืืืช ืืฉ ืืื ืืฉืชืืฉ ืืคืฉืจ ืืืืฉืื ืืืืคืฉ ืืช ืืืฉืชืืฉ ืฉืืฉ ืื ืืื ืืจืื ืืฉืืืืช ืคืชืืืืช. ืื ืืฉืืื ืฉืขืฉืืื ืืืืื ืื ืืื ื Aggregation Pipeline ืคืขืืื ืฉื Max ืฉืืืืืจื ืืช ืืืกืื ืขื ืืขืจื ืืืงืกืืืื. ืืืงืื ืื ืื ืื ื ืฆืจืืืื ืืืฉืชืืฉ ืืืืื ืื limit. ืื ืงืฆืช ืืืืื ืื sort ื ืฉืืข ืืื ืืฉืื ืฉืืืงื ืืืชืจ ืืื ืืืืฉืื ืขืจื ืืงืกืืืื, ืืื ืืื ืื ืืกืคืืง ืืื ืืฉืืื ืืืืืช ืืช ืืชืื ืืช ืืืืช ืืื ืืืืื ืืืืช ืืช ืื ืืืกืืืื. ืื ื ืืงืื:
db.collection.aggregate([
{
$match: {
done: false,
}
},
{
$group: {
"_id": "$owner",
"openTasks": {
$count: {}
}
}
},
{
"$sort": {
"openTasks": -1
}
},
{
$limit: 1,
}
])
ืฉืืืืช ืืืชื ืืช ืืชืืฆืื:
[
{
"_id": "mike",
"openTasks": 2
}
]
ืืืชื ืืืืืื ืืฉืืง ืืืชื ืืงืืฉืืจ ืืื:
https://mongoplayground.net/p/fUtBp28Cakb.1 419
# ืืืจืื ืงืฆืจ ืืืืจืืฆืืืช ื MongoDB
ืืื ืืคืืฆ'ืจืื ืืืืืืื ืขืืื ื MongoDB ืืื ืืืืืืช ืืืืจ ืืื ืืกืืืื ืืงืืืช ืชืืฆืื ืืืืฆืขืืช ืืื ื ืฉืคืช ืชืื ืืช ืฉืืื ืฉื ืงืจืืช Aggregation Pipeline. ืืืื ืืื ืืช ืืืืช ืืืื ืืืื ืจืืฉืื ืื ืืืชื ืฉื, ืืื ืืืจื ืฉืืืืชื ืืืฉืชืืฉ ืืคืืฆ'ืจ ืืืืชืืฆื ืืชืืขืื ืฉืืื ืืืืื ืฉืื ืขื ืืื ืื ืืฉืชืคืจื ืืฉืืขืืชืืช. ืืืื ื ืจืื ืืื ืื ืขืืื.
## ืืื Aggregation Pipeline
ืืืืื ื ืฉืคืช ืชืื ืืช ืจืง ืฉืืชืืื ืืช ืฉืืชื ืืืชืืื ืื ืจืฆื ืขื ืงืื ืืืื ืกืคืฆืืคื: ืจืฉืืืช ืืกืืืื ื Mongo ืฉืืชืืืืื ืืงืจืืืจืืื ืืกืืื. ืื ืคืงืืื ืืชืืื ืืช ืขืืฉื ืืฉืื ืขื ืืงืื ืืื, ืืืฉื ืชืืื ืคืงืืื ืฉืชืืกืืฃ ืฉืื ืืื ืืกืื, ืคืงืืื ืืืจืช ืฉืืกื ื ืช ืืืืฆื ืืืง ืืืืกืืืื, ืคืงืืื ืฉืืืฉืืช ืฉืืฉืืืจื ืจืง ืฉืืืช ืืกืืืืื ืฉื ืืืกืืืื ืืคืงืืื ืจืืืขืืช ืฉืืืืืช ืืกืืืื ืฉืื ืื ืืงืืืฆื. ืืคืงืืืืช ืืืื ื ืงืจืืืช Aggregation Stages ืืืคืฉืจ ืืืฆืื ืจืฉืืื ืฉืืื ืืคืืจืื ืขื ืื ืืืช ืืืฃ ืืชืืขืื ืืื:
https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/.
ืืื ืื Stage ืืื ืืงืื ืคืจืืืจืื ืฉืืืืจืื ืื ืืื ืืืืืง ืืขืฉืืช ืืช ืืืืจ ืฉืื, ืืืฉื ืืคืงืืื
$count ืืืืืคื ืืช ืื ืืืกืืืื ืืืกืื ืขื ืฉืื ืืืื ืฉืืขืจื ืฉืื ืืื ืืื ืืกืืืื ืขืืจื ืืจืื. ืืื ืชืงืื ืคืจืืืจ ืฉืืืื ืื ืื ืฉื ืืฉืื ืฉืืืื ืืืกืื ืืชืืฆืื. ืืคืงืืื $match ืืกื ื ืช ืืช ืืืกืืืื ืฉืขืืืจืื ืืจืื ืืชืชื ืจืง ืืืกืืืื ืืกืืืืื ืืขืืืจ. ืืื ืชืงืื ืคืจืืืจ ืฉืืืืจ ืืืืื ืืกืืืื ืืืชืจ ืืืืฉืื.
ืืช ื Pipeline ืื ืื ื ืืืชืืื ืืชืืจ ืจืฆืฃ ืฉื ืคืงืืืืช ืืชืื ืืขืจื, ืืื ืคืงืืื ืืื ืืืืืงื JavaScript. ืื ืชืืืืจ ืฉืืืงื ืืื ืืืชืจืื ืืืื. ืื ื ืืืืื ื Pipeline:
[
// First Stage
{
$group :
{
_id : "$item",
totalSaleAmount: { $sum: { $multiply: [ "$price", "$quantity" ] } }
}
},
// Second Stage
{
$match: { "totalSaleAmount": { $gte: 100 } }
}
]
ืืฉ ืคื ืฉืชื ืคืงืืืืช: ืืคืงืืื ืืจืืฉืื ื ืืื ืคืงืืืช $group ืืืฉื ืื ืคืงืืืช $match. ืขืืฉืื ืืืื ื ืืืืื ืืื ืืกืืื Mongo ืฉืืืืืื ืืขืืืจ ืืจื ื Pipeline ืืื. ืืืื ืื ื ืจืืื ืื:
[
{ "_id" : 1, "item" : "abc", "price" : NumberDecimal("10"), "quantity" : NumberInt("2"), "date" : ISODate("2014-03-01T08:00:00Z") },
{ "_id" : 2, "item" : "jkl", "price" : NumberDecimal("20"), "quantity" : NumberInt("1"), "date" : ISODate("2014-03-01T09:00:00Z") },
{ "_id" : 3, "item" : "xyz", "price" : NumberDecimal("5"), "quantity" : NumberInt( "10"), "date" : ISODate("2014-03-15T09:00:00Z") },
{ "_id" : 4, "item" : "xyz", "price" : NumberDecimal("5"), "quantity" : NumberInt("20") , "date" : ISODate("2014-04-04T11:21:39.736Z") },
{ "_id" : 5, "item" : "abc", "price" : NumberDecimal("10"), "quantity" : NumberInt("10") , "date" : ISODate("2014-04-04T21:23:13.331Z") },
{ "_id" : 6, "item" : "def", "price" : NumberDecimal("7.5"), "quantity": NumberInt("5" ) , "date" : ISODate("2015-06-04T05:08:13Z") },
{ "_id" : 7, "item" : "def", "price" : NumberDecimal("7.5"), "quantity": NumberInt("10") , "date" : ISODate("2015-09-10T08:43:00Z") },
{ "_id" : 8, "item" : "abc", "price" : NumberDecimal("10"), "quantity" : NumberInt("5" ) , "date" : ISODate("2016-02-06T20:20:13Z") },
]
ืืคืงืืื ืืจืืฉืื ื ืืื ืคืงืืืช $group ืฉืืงืืืช ืืชืืจ ืคืจืืืจ ืืืืืงื. ืืืืืืงื ืืชืืจ ืืื ืืจืื ืืงืืืฆืืช ืฉืื ืื ื ืืื ืื. ืืื ืืืื ืฉืื ืืฉื _id ืขื ืืขืจื $item, ืฉืื ืืืืจ ืืขืืจืืช ืฉืื ืงืืืฆื ืชืืื ืืืืื ืืคื ืืขืจื ืฉื ืฉืื item ืฉื ืื ืืกืื. ืื ืืืกืื ืืจืืฉืื ืืืืข ื Mongo ืืกืชืื ืขื ืฉืื item ืฉืื ืืจืืื ืืช ืืขืจื abc, ืืืื ืฉืืื ืขืืืื ืืกืื ืืื ืืชืืฆืื ืื ืืชื ืื ืืขืืืจ. ืืืจื ืื ืขืืืจืื ืขืื ืืื ืืกืืืื ืขื ืฉืืืืขืื ืืืกืื ืืืืืฉื ืฉืฉืื ืืืื ืืฉืื item ืืช ืืืชื ืขืจื abc. ืืคืขื ืืื ืื ืืืื ืฉืืื ืืืจ ืจืื ืืช ืืขืจื ืืื ืืืืกืืฃ ืืช ืืืกืื ืืืืืฉื ืืืืชื ืงืืืฆื ืืื ืขื ืืืกืื ืืจืืฉืื.
ืื ืื ื ืืืืขืื ืฉืื ืืืกืืืื ืืืืชื ืงืืืฆื ืืืืืื ืืช ืืืชื ืขืจื ืืฉืื _id ืฉืืื, ืื ืืื ืื ืื ื ืืช ืืงืืืฆืืช, ืืื ืื ืืืื ืืฉืืืช ืืืืจืื? ืื ืื ืื ื ืจืืืื ืฉืืคืจืืืจ ืฉ $group ืงืืื ืืื ืืืืืงื ืืืฉ ืฉื ืืืืช ืืคืชื ื ืืกืฃ ืืฉื totalSaleAmount. ืืคืชื ื ืืกืฃ ืืืืืจ ืฉืืืื ืฉืื ื ืืกืฃ ืืืืืืงื ืืชืืฆืื, ืืืขืจื ืฉื ืืฉืื ืืืื ืืืืฉืื ืฉืื ืื ื ืจืืฉืืื ืืืืืืงื - ืืืืืจ ืกืืื ืฉื ืืืคืืืช ืืืืืจ ืืืืืช. ืืื ืืกืื ืฉืืืืข ืืื ืื ืืืงื ืืช ืืืืืจ, ืืืคืื ืืืชื ืืืืืช ืืืืกืืฃ ืืช ืื ืืขืจื ืฉืฉืืืจ ืื ืขืืืจ ืืงืืืฆื.1 419
# ืฉืืืืช ืืจืืืื ืืช ืขืืืื: ืืืืืฅ ืืืจืืืืช
ื ืชืงืืชื ืืืงืจื ืืฉืืื ืืืืช ืฉืืืืืจื ืื ืืื ืืฉืื ืืืืืจ ืืืืืืื ืจืืืืืจืืื, ืืื ืจืง ืืฉืืื ืืืจืืื ืืช ืืืจืืืื ืื ืฉืืื ืฉืฉืืืืื ืฉืืืืช ืืืคืฉืืืช ืืจืืืื ืืช ืขืืืื. ืืืฉืืง ืืื ืืื - ืืืื ืชื ืืืจืืืช ืขืืืื "ืืืืืฅ" ืืช ืืืืจืืืช ืืืืฆืขืืช ืืืืคืช ืื ืจืฆืฃ ืฉื ืืืชืืืช ืืืืช ืืืช ืืืจืฆืฃ ืืืืจืื ืืกืคืจ ืืืืชืืืช ืืจืฆืฃ. ืืืืืื ืื ืืืืจืืืช ืืืงืืจืืช ืืื:
aaaabbccc
ืื ืื ืื ื ืืืืืคืื ืืช ืจืฆืฃ ื a-ืื ื a4, ืืช ืจืฆืฃ ื b-ืื ื b2 ืืืช ืจืฆืฃ ื c-ืื ื c3 ืืืงืืืื:
a4b2c3
ืื ืืชืืฆืื ืืจืืื ืืืชืจ ืืืืืจืืืช ืืืงืืจืืช ืืฉ ืืืืืืจ ืืช ืืืืจืืืช ืืืงืืจืืช, ืืื ืืชืืฆืื ืงืฆืจื ืืืชืจ ืืฉ ืืืืืืจ ืืช ืืชืืฆืื ืืืืืืฆืช.
## ืคืืชืจืื
ืื ืคืขื ืฉืื ื ืฉืืืข "ืจืฆืฃ ืฉื ืืืชืืืช" ืืฉืืื ืืืกืื ืืื ืืื ืื ื ืืืฉื ืขื ืืืืืืื ืจืืืืืจืืื. ืืืืืื ืจืืืืืจื ืื ื ืืืื ืืกืืืจ ืงืืข ืืกืืื ืฉืืฆืืชื ืืกืืืจืืื ืืื ืืืชืืืก ืืืื ืฉืื ืืืืฆืขืืช \1. ืืื ืจืฆืฃ ืฉื ืืืชืืืช ืืื ืืกื ืืื ืืฆืืจืืฃ (\w)\1+ ืื ืื ืืจืฆืฃ ืืืื ืืืืืช ืื ืืืืจื 1 ืื ืืืื (\w)\1*.
ืืฉืืื ืืืืืฅ ืืืจืืืช ืืกืคืืง ืืืฆืื ืจืฆืฃ ืืื ืืืืืืืฃ ืืืชื ืืืืช ืืจืืฉืื ื ืืื ื ืืืืจืื ืืืจื ืืจืฆืฃ. ืืงืื ืืฉืืจื ืืืช ืฉื ืคืืืชืื ืืขื ืคืื ืงืฆืืืช ืืืืงื ืืืื ืืจืื ืื:
import re
def compress(original):
compressed = re.sub(
r'(\w)\1*',
lambda m: m[0][0] + str(len(m[0])),
original)
return compressed if len(compressed) < len(original) else original
def test_compress():
assert compress("a") == "a"
assert compress("aaa") == "a3"
assert compress("aaabbb") == "a3b3"
assert compress("aaabccc") == "a3b1c3"1 419
# ืืชืืจ ืืคืืื ืฆืคืื
ืื ืฉื ื ืืืื ืืืืจืื ืืคื ื ืฉืืืืจืื ืืืืืืืื ืืคืฉืจ ืืจืืืช ืชืืจ ืฉื ืขืฉืจืืช ืืืจืื ืืืืืขืื ืขืืืืื ืืืืืื ืืืื ืืืืฅ ืืคืืื ืฆืคืื - ืื ืืช ืคืืชืื ืืชืืื ืืช ืืืืืื ืืกืืืื. ืืืื ืงืืืื ืืื ืงืืื ืืช ืจืฉืืืช ืืฆืืื ืืื ืฉืืืืืช ืชืืื ื ืฉื ืืคืฉืืฉ ืื ืืคืฉืืฉืืช ืืฉืืื ืืชืืืช ืขื ืืงืืจ, ืืฆื ืืืื ืืชืืื ืืช ืืืืคืื ืืื ืืืืืืืื ืืืืื ืืืืื ืืฉืืฉ ืืืงืืืื ืฉืื ืืกืืจื ืืคื ื ืฉืืืืข ืชืืจื.
ืืชืืจ ืืชืืื ื ืืื ืืื ืืชืืจืื ืฉืืื ืงื ืืืกืื. ืฆืจืื ืจืง ืืชืื ื ืงืืืื ืืืืืช ืืคืชื ืืช ืืชืืื ื ืืคื ื ืืกืืคืช ืืืืจืื ืืืคื ื ืฉืืืืงืื ืืช ืจืฉืืืช ืืฆืืื.
ืื ืื Over Engineering ืืืกืชืื ืงืืืื ืืืืจ ืฉืื ืื ื ืืืืขืื ืฉืืงืจื. ืื ืื Over Engineering ืืขืฉืืช ืฉืืขืืจื ืืืช, ืืืืืง ืื ืงืจื ืืฉื ื ืฉืขืืจื ืื ืื ืงืืจื ืืื ืื ืืืจืื. ืื ืื Over Engineering ืืื ืื YAGNI ืืคืืื ืื ืฉืืืช ืชืืื ื ืืคืืชืื ืืืกืืฃ ืืืืืื ืืื ืืืืชืจ ืขื ืืชืืื ืืช ืืฉื ื.
ืชืื ืื ืงืืืื ืืื ืชืืื ืืฉืืง ืฉื ืกืืืื ืื ืืกืืืืืื ืืืื ืืืฉืืง ืฉืื ืฉื ืืงืฆืืข ืืฉืืงืื ืื ืืื. ืืืื ืขื ื ืชืื ืื ืืชืกืืืจื ืื ืืชื ืืืฉืืื ืฉืืืื ืืงืจืืช ืืืื ืืชืื ืื ืฉืืื ืืขืืืจ ืืฉืื ืืงืจื. ืื ืืืกืืก ื Engineering ืืืืืง.
1 419
# ืงืจืืืจืืื
ืืื ืืื ืคืืชืจ ืืขืืืช ืืืจ?
ืืื ืืื ืจืืื ืืช ืื ืืงืจื ืืงืฆื ืืจืืืื ืืืื?
ืืื ืืคืืชืจืื ืืช ืฉืื ืชืืื ืืื ืืขืืืื?
ืืื ืืชืงืฉืืจืช ืืืชื ืืืื?
ืืื ืืื ืืชืืืฅ ืืคืชืืจ ืืขืื ืืืืืืช ืขืฆืื?
ืืื ืืื ืืืข ืืืงืฉ ืขืืจื ืืฉืฆืจืื?
ืืื ืืื ืชืกืืื ืืืืื ืืื ืืืืืื ืืืฉื ืืฉืืคืจืืืงื ืืืจืฉ ืืช ืื?
ืืื ืืื ืืืืืช ืืืจ?
ืจืืืื ืืช ืขืืืื ืืืืืื ืืคื ืชืื ืืช. ืื ืืืืื ื ืื ืืื ืฉืื ืฉืืขืืืจืื ืืช ืืจืืืื ืืช ืืืืขืื ืืืืื ืืืขืืืื ืืื ืฉืชืืื ืืื ื ืืืื ืฉืืื ื ืืืชื: ืื ืื ื ื ืืชื ืื ืฉืืืืช ืืงืฆืืขืืืช ืืจืืืื ืืื ืืื ืืื ืืชืคืงื ืืชืื ืืฉืืืืช ืืืื. ืืืื ืขื ืื ืืขืืืื ืืจืืืง ืื ื ืืืฆื ืืืื ืจืืืื ืืช ืขืืืื ืืืงืืืื ืืืืืืื ืฉืืจืืื ืืช ืืืชื ืฉืืื ืฅ ืฉืื ืืฉืื. ืืืืฉืื "ืื ื ืืืข ืฉืื ืื ืืฉืืจืื ืืช ืื" ืืคืื ืืงื ืืืืืื, ืืื ืืคืขืืื ืืจืืืฉ ืืฆืคืื ืืจืืืื ืืช ืืืื ืฉืืืื ืืืคืฉืื ืืช ืืืชื ืืืจ ืืืืืง.
ืืื ืืืืก ืืฉ Trade Offs ืืืืช ืชืืื ืืชืืืืืช ืืื ืืืื ืฉืืฆืืื ืืช ืืคืืชืจืื ืืืขืื ืืืืชืจ ืืืื ืฉืืฆืืื ืืชืงืฉืจ ืืืชืจ ืืื ืืช ืชืืืื ืืืืฉืื ืฉืื. ืื ืื ืืชื ืชืงืืขืื ืืื ืืฆืืืืื ืืืฆืื ืืช ืืืืขืื ืืืืฉืื, ืืืื ืฉืืื ืืขืฆืืจ ืจืืข ืืืืฉืื ืืืืฉ ืขื ืืงืจืืืจืืื ืื. ืฉืื ืื ืงืื ืืงืจืืืจืืื ืื ืืืื ืืคืชืื ืืื ืขืืื ืืืฉ ืฉื ืืืืื ืืืืช, ืืืื ืืืืืช ืืืจืื ืืืื ืฉืืืงืชื ืขื ืขืืฉืื.
1 419
ืืืืง ืืืืจืื ืืืกืืื ืฉืื ื ื ืงืจื ื Resolver ืื ื rootValue. ืื ืืืืืืฉ ืฉื ืืกืืืื, ืืืืืจ ืืืืืงื ื JavaScript ืฉืืืืจ ืืื ืืกืืืื ืืฉืืืช ืื ืชืื ืื. ืื ืืื ื ืจืื ืืื ืื ืืืฉืืืืช ืฉืื:
const db = require('../dl/tasks');
module.exports = {
tasks: (args) => {
return db.getTasks();
},
task: (args) => {
const { id } = args;
return db.getTask(id);
},
toggleTask: async (args) => {
const { id } = args;
await db.toggleTask(id);
return await db.getTask(id);
}
};
ืฉืืืฉืช ืืคืื ืงืฆืืืช ืืชืืืืืช ืืฉืืืฉืช ืืฉืืืช ืืืืืืงืืื ืืืืืืืื Query ื Mutation. ืืกืืืื ืืืืืจื ืฉ Task ืืื ืขืื (leaf) ืืฉืืฉ ืื ืืช ืืฉืืืช title, description ื done, ืืืื GraphQL ืืฆืคื ืืงืื ืืืืจื ืืืคืื ืงืฆืืืช ืืืืืงื ืื ืืืืืงืืื ืขื ืฉืืืช ืืื. ืืื ืืื ืืืื ืืืชืคืฉืจ ืืืงืื Promise ืฉืืืืืจ ืืืืืงื ืขื ืฉืืืช ืืื, ืืื ืื ืฉืื ืื ื ืขืืฉืื ืืืืืื ืืื.
## ืืื ืืจืืฆืื ืืฉืืืืชืืช ืืืืืื
ืืคืืกื ืืืืงืชื ืจืง ืืช ืืงืื ืฉื ืจืื ืื ืืขื ืืื ืืฉืืื ืืืืื ืืช ืืื ืื ืื. ืืชื ืืืืื ืื ืืืกืชืื ืืืืืืื ืืื ืืจืืืช ืืช ืืคืจืืืงื ืืืื ืืืคืืื ืืืจืืฅ ืืืชื.
ืื ืชืืจืืื ืืืืื ืืช ืืคืจืืืงื ืื ืืืจื ืืจืฆืช npm install ืชืืืื ืืืคืขืื ืืฆืืื ืืช ืืืขืจืืช ืืืืื ื ืขื ืคืืจื 5000 ืขื ืืคืงืืื:
$ PORT=5000 node bin/www
ืืืจื ืืืคืขืื ืืคืฉืจ ืืืืืฉ ื http://localhost:5000/graphql ืืืงืื ืืืฉืง ืืืืงื ืฉื ื API. ืืืืฉืง ืื ื ืืืชื ืฉืืืืชืืช ืืฆื ืฉืืื ืืืงืื ืืช ืืชืฉืืืืช ืืฆื ืืืื. ืืืืืื ืืฉืืืืชื:
query {
tasks {
title
description
done
}
}
ืชืืืืจ ืืช ืืชืฉืืื:
{
"data": {
"tasks": [
{
"title": "task1",
"description": "write some code",
"done": false
},
{
"title": "task2",
"description": "test it",
"done": false
},
{
"title": "task3",
"description": "deploy",
"done": false
}
]
}
}
ืืฉืืื ืืกืืื ืืฉืืื ืื ื ืืืื ืืืฉืชืืฉ ืืคืื ืงืฆืื toggleTask ืฉืืชืืชื ืขื ืืฉืืืืชื ืืืื:
mutation {
toggleTask(id: 2) {
title
done
}
}
ืืืงืื ืืืืจื:
{
"data": {
"toggleTask": {
"title": "task2",
"done": true
}
}
}
ืฉืื ืืฆื ืืขื ืืื ืื ืืืืืืงื ืืืจื ืืฉืื ืื.
ืืืค ืืืืืื ืืืช: ืืืืจื ืฉืื ืืชื ืืช ื API, ืชืืืื ืืืืืจ ืืคืืกื ืืืืืจ ืืคืืืงืฆืืืช ืจืืืงื ื GraphQL ืฉื ืื ื ืืกืืืจ ืืื ืืืืจ ืงืื ืจืืืงื ืืฉืจืช GraphQL ืืขืืจืช ืกืคืจืืืช Relay.1 419
# ืืืื ื ืืชืื ืฉืจืช GraphQL ื Node.JS ืืื ืืจืืืช ืืื ืื ืขืืื
ืืจืฃ ืงืื ืื ืืื ืืืืจ ืืืืื ืืื ืืื ืฉืืืฆืืื ืืช ืืืื ืืืชืื. ืืื ืคืืชืจ ืืช ืื ืืืขืืืช ืฉื REST ืืื ืขืื ืงืฆืช ืืืืจ ืืชืืชื ืขืืื ืืกืคืจ ืคืืกืืื ืืขืืจ. ืื ืืชื ืื ืืืืจืื ืืช GraphQL ืืืื ืฉืืื ืืืชืืื ืืืืื ืฉืืชืืชื ืืื: ืฉืืื GraphQL.
ืืคืืกื ืืืื ืื ื ืจืืฆื ืืืชืื ืฉืจืช GraphQL ื Node.JS ื Express ืืื ืืจืืืช ืืื ืื ืขืืื. ืืคืจืืืงื ืืื API ืืืขืจืืช ื ืืืื ืืฉืืืืช ืฉืืืคืฉืจ ืื ื ืืจืืืช ืืช ืืืฉืืืืช ืืคืชืืืืช ืืืขืจืืช ืืืขืืื ืกืืืืก "ืืืฆืข" ืฉื ืื ืืฉืืื.
ืืขืืืชื ืืช ืื ืืงืื ืืคืืกื ืืคืจืืืงื ืืืืื ืืืืืืื ืืงืืฉืืจ:
https://github.com/ynonp/express-graphql-demo
## ืฉืืืช ืื ืชืื ืื
ืืืคืืื ืืฉืื ืฉื GraphQL ืืื ืืืคืจืื ืืื ืฉืืืช ืื ืชืื ืื ืืฉืืืช ืืชืงืฉืืจืช. ืืฉ ืื ื ืืฆื ืืื ืืช ืืงืื ืฉืืืืข ืืฉืืืฃ ืืืกืืก ืื ืชืื ืื ืืืขืืื ืฉื ืืช ืืืืืข, ืืงืื ืื ืืืื ืืืืืช ืืชืื ืืื ืกืคืจืื ืฉืชืจืฆื ืืืืืื Mongo, Mongoose, Sequelize ืื ืืื ืฉืื ื ืืืชืื ืืืืืื ืืืื ื knex.js.
ืืืจืื ืืฉ ืื ื ืฉืืืช ืืืืืจ ืฉื ืงืจืืช Resolver ืื Root Value. ืฉืืืช ืืืืืืจ ืืืจืืืช ืขื ืืืคืื ืืขืจืืื ืืืฉืืืืชื ืฉืืฉืชืืฉ ืฉืื ืืคืื ืงืฆืืืช ืืืืฉื ืืืกืืก ืื ืชืื ืื.
ืืืกืืฃ ืืฉ ืื ื ืืช ืืกืืืื ืฉืืชืืจืช ืืืืฆื ืืืื ืืืืข ืื ืื ื ืืืืืื ืืกืคืง.
ืืืคืจืื ืืื ืืฉืืืืช ืชืืคืฉืจ ืื ื ืืขืชืื ืืฉื ืืช ืืงืืืช ืืช ืฉืืืืช ืื ืชืื ืื ืฉืื ื ืืืคืืื ืืืืืืฃ ืืกืืก ื ืชืื ืื ืืืืืืื ืืขืืืื ืืืฉืืืจ ืืช ืืืืฉืง ืืืืฆื ืืืงืืืืช ืืื ืฉืื ืื. ืืกืืื ืื ืื ืื ื ืืืื ืืืืืื ืืืฉืชืืฉ ื GraphQL ืืืจืืืืงืืืจืช Micro Services ืืื ืืื ืืช ืืช ืืชืงืฉืืจืช ืืื ืืกืจืืืกืื ืืฉืื ืื ืืฆืืจื ืืฆืืื.
ื ืชืืื ืืื ืืืช ืฉืืืช ืื ืชืื ืื ืืืคืจืืืงื ืืืืืื ืืืจืชื ื knex.js. ืืงืื ืฉืืืจืื ืขื ืืฉืืืืชืืช ืืื ืืกื ืืื ืงืืืฅ ืงืฆืจ ืฉื ืคืืืช ื 20 ืฉืืจืืช:
// dl/tasks.js
const knex = require('../db/knex');
exports.getTasks = function getTasks() {
return knex.from('tasks').select('*');
}
exports.getTask = function getTask(id) {
return knex.from('tasks').where({ id: id }).first('*');
}
exports.getTasksBy = function getTasksBy(attributes) {
return knex.from('tasks').where(attributes).select('*');
}
exports.toggleTask = function toggleTask(id) {
return knex('tasks')
.where({ id })
.update({ done: knex.raw("CASE WHEN done = 0 THEN 1 ELSE 0 END") });
}
ืืืืืืฉ ืฉื ืืคืื ืงืฆืืืช ืืกืคืฆืืคืืืช ืคืืืช ืืฉืื ืืฉืืื ืืืืืื ืฉืื ื. ืฉืืืืฉ ืืืกืืก ื ืชืื ืื ืืืจ ืื ืืกืคืจืืืช ืืืฉื ืืืจืช ืืืกืืก ืื ืชืื ืื ืืื ืืืืฆืจืื ืืืืืฉืื ืืืจืื, ืืื ืื ืืกืืจ ืืืืจ. ืื ืขืื ืฉืืืช ืืคืื ืงืฆืืืช ืืืคืจืืืจืื ืืืื ืื ืฉืืจ ืืงืื ืื ืืฉืชื ื.
## ืืกืืืื
ื ืขืืืจ ืืฆื ืืฉื ื ืฉื ืืขืืื ืืฉืืื ืืืืจ ืขื ืืกืืืื. ืกืืืื ื GraphQL ืืื ืคืฉืื ืชืืืืจ ืฉื ืืืืืืงืืื, ืืืืคืืื ืื ืฉืืื ืืื ืืฉ ืืื ืืืืืงืืื ืืงืื ื ืื ืื ืื ืชืืืืจ ืฉื ืืืชื ืฉืืืช ืคื ืืืืื. ืืกืืืื ืืชืืจืช ืืจืฃ ืืืืืื ืืืชืืื ืืืฉืคืืื ืืื:
1. ืืื ืืฉืืื ืืฉ ืฉืื "ืกืืืืก" ืืกืื ืืืืืื ื ืืฉืื "ืชืืืืจ" ืืกืื ืืงืกื
2. ืืื ืืฉืชืืฉ ืืืขืจืืช ืืฉ ืฉืื "ืฉื" ืขื ืืฉื ืฉืื
3. ืืื ืืฉืชืืฉ ืืืขืจืืช ืืฉ 1 ืื ืืืชืจ ืืฉืืืืช
4. ืืื ืืฉืืื ืืฉ 1 ืื ืืืชืจ ืชืืืืช
ืืืฉืื ืขื ืืกืืืื ืืืืืง ืืื ืขื ืกืืืื ืฉื ืืกืืก ื ืชืื ืื, ืจืง ืืื ืืืืจ ืขื ืืกืืก ืื ืชืื ืื ืฉืืืืืจืื. ื GraphQL ืืฉ ืฉืคื ืืขื ืืื ืช ืืืชืืืช ืกืืืืืช ืืืคืฉืจ ืืงืจืื ืขืืื ืืื. ืื ื ืืกืืืื ืืืืื ืคืฉืืื ืฉืื ื ืืชืืชื ืืชืืืืจ ืืืฉืืืืช ืืืืืจืื ืฉืื ืื ื ืืืืืื ืืขืฉืืช ืขื ืืืชื ืืฉืืืืช:
type Query {
tasks: [Task],
task(id: Int!): Task
}
type Task {
title: String,
description: String,
done: Boolean,
}
type Mutation {
toggleTask(id: Int!): Task
}
ืืกืืืื ืืืจืืืช ื-3 ืืืคืืกืื:
1. ืืืืคืืก ืืืืืื Query (ืืื ืืืืื ืืืื ืืฉื, Query ืื ืฉื ืฉืืืจ ื GraphQL) ืืืื ืฉืื ืืฉื tasks ืฉืฆืจืื ืืืืืืจ ืจืฉืืืช ืืฉืืืืช, ืืฉืื ืืฉื task ืฉืืงืื id ืืกืื ืืกืคืจ ืืืืืืจ ืืฉืืื ืืืืืช. ืืืฉืื ื ืืืชื "ืฉืื" ืชืืฉืื ืืื "ืคืื ืงืฆืื", ืื ืื ืื ืฉืืืืช ืืฉื ืืฉืืืช ืืืื.
2. ืืืืคืืก ืืืืืื Mutation (ืฉืื ืืืืื ืืืื ืืฉื, Mutation ืืื ืฉื ืฉืืืจ ื GraphQL) ืืืื ืฉืื ืืืื ืืฉื toggleTask. ืฉืื ืืืืืจ ืืื ืคืื ืงืฆืื ืืืคืื ืงืฆืื ืืื ืืงืืืช ืืืื ืืืืืืจื ืืฉืืื.
3. ืืืืคืืก Task ืืชืืจ ืืื ืืฉืืื. ืืื ืืกืคืจ ืื ื ืฉืืืฉืืื ืืฉ ืฉืืืฉื ืฉืืืช: title, description ื done ืืืช ืืกืืืื ืฉืืื.
ืืฉืืื ืืื ืืช ืืืืืงื ืกืืืื ืฉื GraphQL ืื ื ืืขืืืจ ืืช ืืชืืืืจ ืืืงืกืืืืื ืืื ืืคืื ืงืฆืื ืืฉื buildSchema.
## ื Resolver1 419
stream: Stream[Message, Empty]
) -> None:
request = await stream.recv_message()
for q in self.chatters.values():
q.put_nowait(request.text)
await stream.send_message(Empty())
async def main(*, host: str = '127.0.0.1', port: int = 50051) -> None:
server = Server([ChatRoom()])
with graceful_exit([server]):
await server.start(host, port)
print(f'Serving on {host}:{port}')
await server.wait_closed()
if __name__ == '__main__':
asyncio.run(main())
ืืฆื ืืืงืื ืืืชืืจ ืืื ืืืฆืข ืฉืชื ืืฉืืืืช ืืืงืืื: ืื ื ืื ืฆืจืื ืืืชืืืจ ืืฉืจืช ืืืืืคืืก ืื ืืืืขื ืฉืืืืจืช ื Subscribe, ืืื ืฆืจืื ืืืงืฉืื ืืฉืืจืืช ืฉืืฉืชืืฉ ืืงืืื ื stdin ืืื ืคืขื ืฉืืฉืชืืฉ ืืกืืื ืืืชืื ืฉืืจื ืืฉืืื ืืืชื ืืฉืจืช. ืืงืกื ืฉืขืืฉื ืืช ืฉื ื ืืืืจืื ืืืงืืื ืืื ืืคืื ืงืฆืื wait:
async def main() -> None:
await asyncio.wait([
asyncio.create_task(chat()),
asyncio.create_task(read_messages_and_send()),
])
ืื ืคืื ืงืฆืื ืฉืืงืืืช ืืกืคืจ ืคืื ืงืฆืืืช ืืกืื ืืจืื ืืืช ืืืจืืฆื ืืช ืืืื ืืืงืืื. ืืฆืื ืืคืื ืงืฆืื chat ืืื ืื ืฉืืืคืืกื ืืช ืืืืืขืืช ืืืฉืจืช ืืืคืื ืงืฆืื read_messages_and_send ืงืืจืืช ืืืืขืืช ืืืืงืืืช ืืฉืืืืช ืืืชื ืืฉืจืช. ืงืื ืืชืืื ืืช ืืืื ืืงืืืฅ client.py ื ืจืื ืื:
# File: chat_client.py
import asyncio
import sys
from grpclib.client import Channel
from chat_grpc import ChatRoomStub
from chat_pb2 import Message, Empty
async def connect_stdin_stdout():
loop = asyncio.get_event_loop()
reader = asyncio.StreamReader()
protocol = asyncio.StreamReaderProtocol(reader)
await loop.connect_read_pipe(lambda: protocol, sys.stdin)
w_transport, w_protocol = await loop.connect_write_pipe(asyncio.streams.FlowControlMixin, sys.stdout)
writer = asyncio.StreamWriter(w_transport, w_protocol, reader, loop)
return reader, writer
async def chat() -> None:
async with Channel('127.0.0.1', '50051') as channel:
stub = ChatRoomStub(channel)
async with stub.Subscribe.open() as stream:
await stream.send_message(Empty(), end=True)
async for reply in stream:
print(reply)
async def read_messages_and_send() -> None:
reader, writer = await connect_stdin_stdout()
async with Channel('127.0.0.1', '50051') as channel:
stub = ChatRoomStub(channel)
while True:
res = await reader.read(100)
if not res:
break
await stub.SendMessage(Message(text=res))
async def main() -> None:
await asyncio.wait([
asyncio.create_task(chat()),
asyncio.create_task(read_messages_and_send()),
])
if __name__ == '__main__':
asyncio.run(main())
ืืืืื ืื ืื ืกืืช ืืืจืืฅ ืืฆืืื ืืืืื ืืื ืืช ืืฉืจืช ืืืืกืคืจ ืืืื ืืช ืืืจืื ืืช ืชืืื ืืช ืืืงืื ืืืจืืืช ืืื ืืืืื ืืช ืืืืจืื ืืื ืขื ืืฉื ื.
## ืื ืืืืชื
ืกื ืืื gRPC ืืื ืกืคืจืื ื ืืืื ืืืืืืจ ืืื ืืกืคืจ ืกืจืืืกืื. ืืขืืืื ืฉืืฉ ืื ืชืืืื ืืืื ืกืืฃ ืฉืคืืช ืชืื ืืช ืืืืจืช ืฉืืืื ืื ื ืงื ืืืืจ ืงืื ืฉืืชืื ืืฉืคืืช ืฉืื ืืช, ืืงืืืฅ ื proto ื ืืชื ืื ืืจื ืกืื ืืจืืืช ืืืืืืจ ืืืฉืง ืขืืืจ ืืกืจืืืก ืฉืื.
## ืื ืื ืืืืชื
ืืืจืืช ืฉืื ืื ื ื 2021, ืืกืคืจืื ืืจืืืฉื ืงืฆืช ืืื ืืืจื ืืืื. ืืขืืงืจ ืืืชื ืืกืจื ืื ืชืืืื ืืืื ืืช ืื ืืืื ืืจืฉืืืช (ืื ืจืืืชื ืฉืืฉ ืืฉืื ืืืื ื ืฉื ืืืื ืืืคืฉืจืืช ืืืืกืืฃ ืคืืืืื ืื. ืื ืื ื ืจืื ื ืื), ืืืื ื REST, ืื ืืื ืืืืฉืง ืืืื ืงืฉืื. ืื ืฉืื ืื ืงืื ืืืืืข ืืืืื ืฉืื ืื ืฉื ืืคืจืืืืงืื ืืชืืืื ืืื ืืกืคืจ ืกืจืืืกืื.
ืืืืืจื ื gRPC ืืื ืืืืจื ืืืืฆืืขืื ืขื ืืฉืืื ืืืืฉืืช. ืืฉืืชื ืืกืืืืืฆืื ืฉืืืืฆืืขืื ืงืจืืืืื ืืฆืจืืืื ืืืขืืืจ ืืจืื ืืืืข ืืืืจ ืืืื ืืืืืช ืฉ gRPC ืืืื ืคืืชืจืื ืืื. ืืจืื ืืกืืืืืฆืืืช GraphQL ืืืชื ืชืืฆืื ืืืชืจ ืืืื ืืืื ื ืืืืช ืืขืืืื ืืืืืืฉืืช ืฉื ืืคืจืืืืงืื.1 419
await stream.send_message(HelloReply(message=message))
async def main(*, host='127.0.0.1', port=50051):
server = Server([Greeter()])
# Note: graceful_exit isn't supported in Windows
with graceful_exit([server]):
await server.start(host, port)
print(f'Serving on {host}:{port}')
await server.wait_closed()
if __name__ == '__main__':
asyncio.run(main())
ืืฆื ืืืงืื ืื ื ืืืฉื ืืืจ ืฉื ืงืจื Stub ืืชืื ืืืชื ืงืืืฅ grpc ืฉื ืืฆืจ ืืืืืืืืช, ืืืขืืจืชื ืืคืขืื ืคืื ืงืฆืื ืืจืืืงืช. ืืคืขื ืืงืื ื ืจืื ืืจืื ืืืชืจ ืืืขื ืืคืืืชืื ืืืืจ ืื ืืจืืืฉืื ืืช ืืขืืืื ืืืืืืจืช:
reply = await greeter.SayHello(HelloRequest(text=line.strip()))
ืืื ืงืื ืฆื ืืืงืื ืืืื:
# File: client.py
import asyncio
from grpclib.client import Channel
# generated by protoc
from sayhello_pb2 import HelloRequest, HelloReply
from sayhello_grpc import GreeterStub
import sys
async def main():
async with Channel('127.0.0.1', 50051) as channel:
greeter = GreeterStub(channel)
for line in sys.stdin:
reply = await greeter.SayHello(HelloRequest(text=line.strip()))
print(reply.message)
if __name__ == '__main__':
asyncio.run(main())
ืื ื ืฉืืจืชื ืืช ืงืื ืฆื ืืฉืจืช ืืงืืืฅ server.py ืืืช ืงืื ืฆื ืืืงืื ืืงืืืฅ client.py ืืื ืืคืฉืจ ืืฉื ื ืืืื ืืช ืฉืื ืื ืืืคืขืื ืืช ืืฉืจืช ืืืืงืื, ืืืชืื ืืฉืื ืืืกืืฃ ืืฆื ืืืงืื ืืืจืืืช ืืช ืืืืคืกื ืฉืืืืจืช ืืืฉืจืช.
## ืชืืื ืืช ืฉื ืื: ืฉืจืช Chat
ื ืืฉืื ืืืฉืื ืงืฆืช ืืืชืจ ืืชืืืื ืืืื ืชืืื ืืช ืฆ'ื. ืื ืืืื ืืฉืจืช Echo ืฉืืกื ืืื ืฉืืื ืื ืืืืจื ืืช ืื ืฉืืชืืช, ืชืืื ืืช ืฆ'ื ืฆืจืืื ืืืืืจ ืืช ืื ืืืงืืืืช ืืืืืืจืื ืืื ืคืขื ืฉืืื ืืื ืฉืืื ืืืืขื ืืื ืฆืจืืื ืืืืืืข ืืื ืืืงืืืืช ืืืืจืื. ืืฉ ืคื ืฉื ื ืืชืืจืื ืืืฉืื ืื ืืฆื ืืฉืจืช ืืื ืืฆื ืืืงืื:
1. ืืฆื ืืืงืื ืื ื ืืืจ ืื ืืืืข ืืชื ืื ื ืืงืื ืืช ืืืืืขื ืืืื. ืื ื ืื ืืืื ืืกืืื ืขื ืื ืฉืืืืขื ืชืืืข ืจืง ืืชืืจ ืชืฉืืื ืืืืืขื ืฉืื ื ืฉืืื, ืื ืืฉ ืื ืฉืื ืืืจืื ืืืืจ ืฉืฉืืืืื ืืืงืืืื ืืืืขืืช ืื ืืืื.
2. ืืฆื ืืฉืจืช ืื ื ืืืจ ืื ืืืื ืืฉืืื ืืืืขื ืืืจื ืจืง ืืื ืฉืืจืืข ืคื ื ืืืื, ืืฆืจืื ืืฉืืืจ ืืช ืื ืืืงืืืืช ืืืืืืจืื ืืืืืจืื ืืื ืฉืื ืคืขื ืฉืืื ืฉืืื ืืืืขื ืืืื ืืืืืืจ ืืช ืืืืืขื ืื ืืื ืืืืจืื.
ื ืชืืื ืขื ืืคืจืืืืงืื. ืืืื ืฉืื ืืกื ืืื ืืฉืืง ืขื gRPC ืืกืคืืงืืช ืื ืฉืชื ืคืื ืงืฆืืืช:
syntax = "proto3";
service ChatRoom {
rpc Subscribe (Empty) returns (stream Message) {}
rpc SendMessage (Message) returns (Empty) {}
}
message Message {
string text = 1;
}
message Empty {}
ืืงืื ืืงืจื ืืคืื ืงืฆืื Subscribe ืืืชืฉืืื ืฉืืื ืืงืื ืชืืื stream ืฉื ืืืืขืืช. ื gRPC, ืืืืื stream ืืืืจืช ืฉืื ื ืืืื ืืฉืืื ืืืชืจ ืืชืฉืืื ืืืช. ืืืงืืื ืืงืืืืช ืืืจืื ืื ืืืชื ืืงืื ืืืืืื ืืงืจืื ืืคืื ืงืฆืื SendMessage ืืื ืืฉืืื ืืืืขืืช. ืืฉืืืฉืื ืงืืจื ื SendMessage ืื ืื ืืื ืฉืขืืฉืื ืชืงืืขืื ืขื Subscribe ืืงืืืื ืืช ืืืืืขื ืืืืฉื, ืืื ืืกืืื ืืช ืืชืงืฉืืจืช.
ื ืืฉืื ืขื ืงืื ืฆื ืืฉืจืช. ืืฆื ืืฉืจืช ืื ื ืฉืืืจ ืืืืืงื ืืื ื ื ืชืื ืื ืฉื ืืืืื ืฉืืืืืง ืืช ืื ืืืงืืืืช ืืืืืืจืื. ืืืคืชื ืืื ืืชืืืช ืืืงืื ืืืขืจื ืืื ืชืืจ ืืืืขืืช ืฉืืฉ ืื ืขืืืจ ืืืชื ืืงืื. ืื ืคืขื ืฉืืงืื ืืืฉ ืืชืืืจ ืื ื ืืืฆืจ ืขืืืจื ืฉืืจื ืืืฉื ืืืืืื ืื ืื ืก ืืืืืื ืฉืื ืื ืคืขื ืฉืืฉ ืืืืขื ืืืฉื ืื ื ืฉืืื ืืืชื. ืื ืืชืคืงืื ืฉื ืืคืื ืงืฆืื Subscribe.
ืืคืื ืงืฆืื ืืฉื ืื, SendMessage ืคืฉืื ืืืกืืคื ืืช ืืืืืขื ืืชืืจ ืฉื ืื ืืืงืืืืช ืืืืืืจืื.
ืงืื ืฆื ืืฉืจืช ืืืื ื ืจืื ืื:
# File: chat_server.py
import asyncio
from grpclib.server import Server, Stream
from grpclib.utils import graceful_exit
from chat_grpc import ChatRoomBase
from chat_pb2 import Message, Empty
class ChatRoom(ChatRoomBase):
def __init__(self):
self.chatters = {}
async def Subscribe(
self,
stream: Stream[Empty, Message]
) -> None:
peer = stream.peer.addr()
try:
self.chatters[peer] = asyncio.Queue()
request = await stream.recv_message()
while True:
message = await self.chatters[peer].get()
await stream.send_message(Message(text=message))
self.chatters[peer].task_done()
finally:
print(f"Bye bye {peer}")
del(self.chatters[peer])
async def SendMessage(
self,
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
