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.

Reply via email to