2017-07-02 30 views
1

我正在實現一個REST服務器與節點與MongoDB作爲持久性數據庫。

我想實現一個GET操作,它返回一個集合中的隨機文檔,但是當我實現$ sample(聚合)方法時,它的工作方式就好像我正在實現一個返回所有文檔的find({})。

這是用我的server.js文件中的代碼i'm

app.get("/api/contacts", function(req, res) { 

    //GET: find a random contact 
    db.collection(CONTACTS_COLLECTION).aggregate(
    { $sample: { size: 1 } }).toArray(function(err, docs) { 
    if (err) { 
     handleError(res, err.message, "Failed to get contacts."); 
    } else { 
     res.status(200).json(docs);  
    } 
    }); 

}); 

的要求server.js文件的一部分是這樣的:

var express = require("express"); 
var bodyParser = require("body-parser"); 
var mongodb = require("mongodb"); 
var ObjectID = mongodb.ObjectID; 

var CONTACTS_COLLECTION = "contacts"; 

var app = express(); 
app.use(bodyParser.json()); 

說我的版本使用的是:

  • OS Windows 8.1中
  • 節點v6.11.0
  • 表達3.10.10
  • 的MongoDB 3.2.13(從MLAB雲DB)

附加信息:如果嘗試連接到與Mongobooster數據庫客戶端和運行:

db.contacts.aggregate(
    [ { $sample: { size: 1 } } ] 
) 

它的工作原理確定發現並返回一個隨機文件,但在REST操作就無法正常工作,所以沒有任何附加的重在這種情況下的限制?

+1

聚合函數不應該帶數組嗎?所以:db.collection(CONTACTS_COLLECTION).aggregate([{$ sample:{size:1}}]) – benjiman

+0

謝謝@benjiman,這是錯誤的,現在運行良好。請把你的評論作爲答案,我可以評價你的解決方案。 –

+0

歡迎您。我剛剛發佈了我的答案。很高興我能幫上忙 :) – benjiman

回答

1

Aggregate在輸入時需要一個參數數組。你忘了把你的$sample命令放到一個數組中:

db.collection(CONTACTS_COLLECTION).aggregate([{ $sample: { size: 1 }}]).toArray();