iT邦幫忙

0

Mongodb隨機find()出n筆document

如題,
想從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

懇請各位大大解答,謝謝

dragonH iT邦超人 6 級 ‧ 2019-08-05 21:15:29 檢舉
方便 dump 你的資料給我嗎
p39212053 iT邦新手 5 級 ‧ 2019-08-05 21:19:04 檢舉
{ "_id" : ObjectId("5d4596a27cf65f4d8c472890"), "pname" : "fine", "total_number" : "3230000000" }
{ "_id" : ObjectId("5d4596387cf65f4d8c472886"), "pname" : "desk", "total_number" : "3000000000" }
{ "_id" : ObjectId("5d4596b97cf65f4d8c472893"), "pname" : "green", "total_number" : "25270000000" }
{ "_id" : ObjectId("5d4596c07cf65f4d8c472894"), "pname" : "blue", "total_number" : "25270000000" }
{ "_id" : ObjectId("5d4596c87cf65f4d8c472895"), "pname" : "black", "total_number" : "25270000000" }
{ "_id" : ObjectId("5d4596cd7cf65f4d8c472896"), "pname" : "red", "total_number" : "25270000000" }
{ "_id" : ObjectId("5d4596d57cf65f4d8c472897"), "pname" : "white", "total_number" : "25270000000" }
{ "_id" : ObjectId("5d4596db7cf65f4d8c472898"), "pname" : "brown", "total_number" : "25270000000" }

以上是db內容~

1 個回答

1
dragonH
iT邦超人 6 級 ‧ 2019-08-05 21:30:23
最佳解答

因為 aggregate 不是這樣用的

話說你都沒有用有 code intelligence 的 ide 嗎 /images/emoticon/emoticon13.gif

你要的應該是這樣

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} {上面的備份檔路徑}
看更多先前的回應...收起先前的回應...
p39212053 iT邦新手 5 級 ‧ 2019-08-05 21:49:52 檢舉

我是用Visual studio code來撰寫,
偶爾還是會指出語法錯誤,
但寫這個的時候並沒有跳出錯誤 @@
另外一個可能是沒有安裝插件 所以沒有 code intelligence (⊃д⊂)


感謝~
第一次撰寫code還有很多不懂的地方
多謝 dragonH 大大 肯指導 (^^;)

p39212053 iT邦新手 5 級 ‧ 2019-08-05 22:05:28 檢舉

用了以下code但是取不到query後的結果 QQ

console.log("result"+result);
resolve(result);

輸出 是

[object Object]
dragonH iT邦超人 6 級 ‧ 2019-08-05 22:20:24 檢舉

我也是用 vs code 寫的呀 XD

你沒發現你原本的 code

寫到

.aggregate

他就沒提示了/images/emoticon/emoticon06.gif


你試試

JSON.stringify(result)

是什麼

我測試時是有加

.toArray()

p39212053 iT邦新手 5 級 ‧ 2019-08-05 22:26:58 檢舉

感謝 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
dragonH iT邦超人 6 級 ‧ 2019-08-05 22:45:07 檢舉

你的 toArray 寫錯了

應該是 resolve(results)

然後 toArray 可以不用寫成 callback

p39212053 iT邦新手 5 級 ‧ 2019-08-05 23:03:22 檢舉

抱歉 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

(இ﹏இ`。)

dragonH iT邦超人 6 級 ‧ 2019-08-05 23:07:25 檢舉

這樣有阿

你試試

console.log(h_temp);
p39212053 iT邦新手 5 級 ‧ 2019-08-05 23:14:21 檢舉

有了 /images/emoticon/emoticon13.gif
抱歉問了蠢問題.....
非常感謝 (´・ω・;`)

dragonH iT邦超人 6 級 ‧ 2019-08-05 23:18:48 檢舉

/images/emoticon/emoticon82.gif

我要發表回答

立即登入回答