2017-07-02 49 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(); 
相关问题