如題,
想從DB取出排名前幾n資料,
並從中隨機取出一筆,
dbDocumentCount為db裡面document的總數,
app.js
router.post('/getPersonallyQuestion', async (req,res,next)=>{
const h_temp = await high()
.then( h_temp => h_temp )
.catch( err => res.status(500).send({ message: err }).end() );
});
const high = () => {
return new Promise(async (resolve, reject) => {
const result = await db.getDB().collection(collection).find().sort({total_number : -1})
.limit(dbDocumentCount/3)
.aggregate( [{ $sample: { size: 1 } } ] )
resolve(JSON.stringify(result));
});
};
但用以上會有以下錯誤
UnhandledPromiseRejectionWarning: TypeError: db.getDB(...).collection(...).find(...).sort(...).limit(...).aggregate is not a function
懇請各位大大解答,謝謝
因為 aggregate 不是這樣用的
話說你都沒有用有 code intelligence 的 ide 嗎
你要的應該是這樣
await db.getDB().collection(collection).aggregate([
{ $sort : { total_number : -1 } },
{ $limit : 3 },
{ $sample: { size: 1 } }
]);
順帶一提
備份 mongodb 可以在 cmd 輸入
mongodump --port {你的port號} -d {你的DBname}
還原可以用(選用 --drop)
mongorestore --port {你的port號} -d {你的DBname} {上面的備份檔路徑}
我是用Visual studio code來撰寫,
偶爾還是會指出語法錯誤,
但寫這個的時候並沒有跳出錯誤 @@
另外一個可能是沒有安裝插件 所以沒有 code intelligence (⊃д⊂)
感謝~
第一次撰寫code還有很多不懂的地方
多謝 dragonH 大大 肯指導 (^^;)
用了以下code但是取不到query後的結果 QQ
console.log("result"+result);
resolve(result);
輸出 是
[object Object]
我也是用 vs code 寫的呀 XD
你沒發現你原本的 code
寫到
.aggregate
他就沒提示了
你試試
JSON.stringify(result)
是什麼
我測試時是有加
.toArray()
啦
感謝 dragonH 大大,
有使用 JSON.stringify(result) 的方法了,不過會顯示錯誤,
所以改用以下code
const high = () => {
return new Promise(async (resolve, reject) => {
const result = await db.getDB().collection(collection).aggregate([
{ $sort : { total_number : -1 } },
{ $limit : 3 },
{ $sample: { size: 1 } }
]).toArray(function(err, results) {
console.log(results);
resolve(result);
});
});
};
但是他跳回
router.post('/getPersonallyQuestion', async (req,res,next)=>{
const h_temp = await high();
console.log(h_temp+"h_temp");
});
會顯示
undefinedh_temp
你的 toArray 寫錯了
應該是 resolve(results)
然後 toArray 可以不用寫成 callback
抱歉 dragonH 大大 我改寫了
const high = () => {
return new Promise(async (resolve, reject) => {
const result = await db.getDB().collection(collection).aggregate([
{ $sort : { total_number : -1 } },
{ $limit : 3 },
{ $sample: { size: 1 } }
]).toArray();
console.log(result);
resolve(result);
});
};
但他跳回路由還是抓不到
router.post('/getPersonallyQuestion', async (req,res,next)=>{
const h_temp = await high();
console.log(h_temp+"h_temp");
});
[object Object]h_temp
(இ﹏இ`。)