我有一個Mongo文檔,其中有一個項目列表。每個項目都有一些與之相關的狀態。
我想用$elemMatch
返回誰擁有符合某些標準,其狀態的文檔。
請考慮以下文件。它代表一個訂單,並在訂貨每個項目是不同的(它們代表眼鏡):
{
"_id" : ObjectId("5335dcd6888a4f21dd77657c"),
"items" : [
{
"lens_type" : "STANDARD_INDEX_LENS",
"status" : {}
},
{
"lens_type" : "NO_LENS",
"status" : {
"shipped" : true
}
},
{
"lens_type" : "RX_SUN_LENS",
"status" : {
"received_from_lab" : true,
"sent_to_lab" : true,
"shipped" : true
}
}
]
}
我想找到它們是「未發貨」的所有項目 - 也就是說,items.status.shipped
不存在。我想找到所有準備發貨的物品。
但是,如果該物品有處方鏡片 - lens_type
要麼是STANDARD_INDEX_LENS
要麼是RX_SUN_LENS
- 如果從實驗室收到,我只會認爲它沒有發貨。 item.status.received_from_lab
存在。
以上文件不應該由我的查詢返回。這是因爲其中兩件物品已發貨,另一件未發貨,但尚未received_from_lab
。
但是,我的查詢確實是返回這個文件!
這裏是我的查詢:
{
"$and": [
{
"items": {
"$elemMatch": {
"lens_type": {
"$in": [
"STANDARD_INDEX_LENS",
"RX_SUN_LENS"
]
},
"status.received_from_lab": {"$exists": true}
}
}
},
{
"items": {
"$elemMatch": {
"status.shipped": {"$exists": false}
}
}
}
]
}
什麼是我的查詢中的邏輯錯誤?我應該使用什麼構造呢?我需要在客戶端進行這種過濾嗎?
我現在讀了幾遍。我看到了兩個可能的答案,但這取決於你期望**看到的結果。你能否將你的「結果」添加到問題中,或者至少確認你期望這個「整個」文檔是否匹配。 –
@NeilLunn你好!我的期望是這個文件不*匹配。因爲: 1.第一項有'STANDARD_INDEX_LENS',但沒有'status.received_from_lab'鍵。因此,即使它也缺少關鍵'status.shipped',它不符合條件。 2.第二個和第三個項目的關鍵是'status.shipped',所以它也不符合裝運條件。 因爲沒有任何物品可能被運送,那麼文件不應該被退回。 – poundifdef