2017-05-05 123 views
0

我試圖構建查詢以實際上有趣的方式與數據庫進行交互。其中之一是在一定的年限內搜索文件。我的想法是建立一個聚合管道,在這裏我檢查是否在搜索表單中選擇了年份範圍,然後返回匹配的文檔。如果未選擇範圍,則返回所有文檔並轉到聚合管道的下一個階段。

這是我曾嘗試(只有一個階段,在aggregate因爲我還沒有成功地使這第一個工作,至今):

db.collection('archives').aggregate([ 
 
     { $cond: { if: yearStart.length === 4 && yearEnd === 4 }, 
 
     then: { $match: 
 
      { $and: 
 
      [ 
 
       { year: {$gte: yearStart} }, 
 
       { year: {$lte: yearEnd} } 
 
      ] 
 
      } 
 
     }, 
 
     else: { $match: {} } 
 
     } 
 
    ]).toArray((err, docs) => { 
 
     if (err) throw (err) 
 
     res.json(docs) 
 
    })

所以,這不起作用。我收到錯誤MongoError: A pipeline stage specification object must contain exactly one field.。所以我認爲這只是一個附帶說明的$cond聲明的問題。但不是。我在這裏遇到了​​崩潰。所以我想,也許$cond並不意味着像這樣使用(返回$match階段)。我傾向於這樣認爲,因爲文檔只顯示了一個返回簡單值的例子......是不是?

在此先感謝!

+0

聚合管道管道。無條件的。根據用戶輸入保存應用層的「*,如果在搜索表單中選擇了年份範圍*」邏輯,並執行不同的查詢。 –

回答

1

創建查詢對象與$match管道外面與第一本地JavaScript條件語句被用作使用$cond操作者只適用指定流水線級內。在這裏你使用 它作爲一個流水線步驟,因此引發錯誤。

考慮以下幾點:

const query = { "year": { } }; 
if (yearStart.length === 4 && yearEnd === 4) { 
    query["year"]["$gte"] = yearStart; 
    query["year"]["$lte"] = yearEnd;  
} 

db.collection('archives').aggregate([ { "$match": query } ]).toArray((err, docs) => { 
    if (err) throw (err); 
    res.json(docs); 
}); 

或者使用find()方法

db.collection('archives').find(query).toArray((err, docs) => { 
    if (err) throw (err); 
    res.json(docs); 
}); 
相關問題