如何在MongoDB中仅返回字段的值

18

在mongodb中应用查找操作后,我得到以下文档列表。

  db.users.find(....)

我得到了:

 { "text" : "Hey" }
 { "text" : "Hi" }
 { "text" : "Hello" }
 { "text" : "yes" }

我该如何将它转换成

 ["Hey","Hi","Hello","yes"].

我尝试过

 db.users.find(...).map( function(u) { return "u.text"; } )

但它正在显示错误!


抱歉,我不明白你的意思。你想说什么? - shashank
我尝试了db.users.find(...).map(function(u){return "u.text";})但是它报错了! - shashank
而像你上面描述的使用map这样的用法被称为“后处理”。此外,您需要学习如何在此处编辑您的问题,而不是在评论中提供相关信息。 - Neil Lunn
所以为什么这个命令会出错?正确的方法是什么? - shashank
现在它运行良好,我想问的是 -如果我们有一些数组而不是键值..像:db.users.find(...)然后我们得到这个:{ "do" : [ "A" , "B" ] }而我只想要这个 -[ "A" , "B" ]。我使用了db.twitter.find(...).map( function(doc) { return doc.following } ),它给了我:[ [ "A" , "B" ] ]。如何获得所需的内容。 - shashank
显示剩余5条评论
6个回答

17

我不确定你的语言实现是什么,但基本概念是:

var result = []
db.users.find().forEach(function(u) { result.push(u.text) })

返回给result的值为:

["Hey","Hi","Hello","yes"]

9

起初,db.users.find(...).map() 无法工作,因为 db.users.find(...) 并未返回一个真正的数组。

因此你需要先将其转换为数组。

db.users.find(...).toArray()

然后,如果您应用map()函数,它将会起作用。
  db.users.find(...).toArray().map( function(u) { return u.text ; } )

另一个简单的技巧是使用.forEach()。

这将起到作用。

var cursor = db.users.find(...); // returns cursor object which is a pointer to result set

var results = [];
cursor.forEach(
  function(row) {
     results.push(row.text);
  });

results //results will contain the values

8
另一个选项是直接使用distinct
db.users.distinct("first_name");

Would return:

[
  "John",
  "Jennifer",
  ...
]

2

您可以使用

var u=db.users.find({...},{text:1,_id:0})
while(u.hasNext()){print(u.Next().text);}

1
这里的正确答案是方法.distinct()(文档)
在您的情况下,请尝试以下方式:
db.users.find(....).distinct('text')

那将仅返回值。


0

最好的方法是:

db.users.distinct("text");


["Hey","Hi","Hello","yes"].

您可以在此处获取有关该主题的更多信息:mongodb distinct


欢迎来到SO!请先看一下之前给出的其他答案。你的方法已经在那里提到了。为了保持网站的清晰和方便查找答案,我们尽量避免重复回答。 - ahuemmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接