On Thursday, 16 July 2015 at 20:17:54 UTC, Jarl André Hübenthal
wrote:
On Thursday, 16 July 2015 at 20:00:38 UTC, Ali Çehreli wrote:
On 07/16/2015 12:35 PM, "Jarl
=?UTF-8?B?QW5kcsOpIEjDvGJlbnRoYWwi?= <jarl.an...@gmail.com>"
wrote:
Hi
using mongo with vibe.d is easy. But I would like to skip the
foreach on
MongoCursor?
I mean, I want to use map!, filter! and reduce! on the
resulting docs.
Is there a fast way to convert MongoCursor to an array
without resolving
to ugly for loops with appender! ?
I've never used MongoCursor but judging from the fact that it
has empty, front, and popFront(), it is an InputRange:
http://vibed.org/api/vibe.db.mongo.cursor/MongoCursor
Have you tried using it with map and others? What errors do
you get?
Ali
Ah well I got another error now. Using the following code:
Resource[] getResource() {
auto coll = client.getCollection("app.resource");
return coll.find().map!(doc => deserialize!(BsonSerializer,
Resource)(doc));
}
I get this error:
src/app.d(51,21): Error: cannot implicitly convert expression
(map(coll.find())) of type MapResult!(__lambda1,
MongoCursor!(Bson, Bson, typeof(null))) to Resource[]
Most of the functions from std.algorithm and std.range return a
lazy range which you need to iterate over go get its elements.
To turn those ranges to an array you need add a .array at the end
(http://dlang.org/phobos/std_array#array). Here's a larger
example: http://d.readthedocs.org/en/latest/introduction.html.
Another option is to return the elements as a range (by making
return type of your function auto), instead of putting them into
a newly allocated array (with .array). This way may be a bit more
work (delaying the call to .array), but it can be quite efficient
because it removes the need to allocate memory.