application
コレクションはstatus
フィールドと埋め込みoffer
フィールドにはstatus
フィールドも含まれます。 application
にはoffer
が付いていない可能性があります。MongoDB - 埋め込みドキュメント付きのカスタムソート集約
私がソートする必要がある条件は少し複雑です。
第一:
注文がなければならないノーオファーしたアプリケーションおよびこれらを除くステータスのいずれかの値:rejected
、assigned
、accepted
pending
第二であります
3番目:オファーのアプリケーションはオファーステータス:rejected
第4回:オファーとオファーのアプリケーションATUは次のとおりです。withdrawn
第5回:他の例
私がしようとしていますクエリはこれです:
db.application.aggregate([
{
"$project": {
"_id": 1,
"status": 1,
"job": 1,
"offer": 1,
"user": 1,
"denormalized": 1,
"custom_sort": {
$cond: {
if: { $eq: ["offer.$status", "pending"] }, then: 1,
else: {
$cond: {
if: { $ne: ["$status", ["rejected", "assigned", "accepted"]] }, then: 2,
else: {
$cond: {
if: { $eq: ["offer$status", "rejected"] }, then: 3,
else: {
$cond: {
if: { $eq: ["offer$status", "withdrawn"] }, then: 4,
else: 5
}
}
}
}
}
}
}
},
{"$sort": {"custom_sort": 1}},
{ "$project": { "_id": 1, "status": 1, "job": 1, "offer": 1, "user": 1, "denormalized": 1, "custom_sort": 1 } }
])
クエリが動作します。しかし、期待通りではありません。 私が持っている二つの問題があります。
1-アプリケーションが提供されていない場合、最初の条件はどのように私は条件
いくつかのサンプルアプリケーション場合にand
またはor
を使用することができます
2-無視されます。ドキュメント:
{
"_id" : ObjectId("59f0c8c517587d306033f9f2"),
"status" : "new",
"offer" : {
"status" : "withdrawn"
}
},
{
"_id" : ObjectId("59f0b38517587d29bb1eb6b3"),
"status" : "new",
"offer" : {
"status" : "rejected"
}
},
{
"_id" : ObjectId("59f0b35717587d29bb1eb6b2"),
"status" : "new",
"offer" : {
"status" : "pending"
}
},
{
"_id" : ObjectId("58de110e46fc387b39744285"),
"status" : "rejected"
},
{
"_id" : ObjectId("58de119946fc3876035f823c"),
"status" : "new"
}
は実際にあなたが期待する文書の順番を「あなたが考慮しなければならない状況」となっていますか? –
@AlexBlex。はい。 – Mojtaba