I am dealing with collections of documents in the 2500+ range. The code you suggested is similar to what I have already, but much cleaner. I'm assuming the lookup within the map is done in constant time?

Cheers,

Jeremy


On Thu, Oct 17, 2013 at 10:41 AM, Christian Grün <christian.gruen@gmail.com> wrote:
Hi Jeremy,

if the list is more or less arbitrary, then you’ll indeed have to
browse all your documents in order to find the ones that are relevant
you. One approach could be to specify a filtering predicate:

    let $paths := ("a.xml", "b.xml")
    return db:open("db")[db:path(.) = $paths]

If this is too slow, string comparisons can be sped up by using a map,
as recently proposed on this list:

    let $paths := ("a.xml", "b.xml")
    let $map := map:new( $paths ! { . : true() })
    return db:open("db")[$map(db:path(.))]

How many documents are stored in your database?

Best,
Christian
___________________________

> Yes, sorry I should have specified the criteria. I have a list of a subset
> of the documents in the database that need to be opened (I can store this
> list in any form necessary), but I am experiencing performance problems
> since I need to iterate over the list in order to filter or choose which
> documents to open.
>
> Thanks,
>
> Jeremy
>
>
> On Thu, Oct 17, 2013 at 10:18 AM, Christian Grün <christian.gruen@gmail.com>
> wrote:
>>
>> Hi Jeremy,
>>
>> > Is there a method to
>> > open a subset of documents (not distinguishable by path) in the database
>> > with performance similar to calling db:open($db_name)?
>>
>> Is there any criteria regarding the documents you want to open? If you
>> simply want to choose the first 10 documents, you could try a position
>> filter:
>>
>>    collection("db")[position() = 1 to 10]
>>
>> Talking about performance: fn:collection and db:open are based on the
>> same code, so there shouldn’t be any difference.
>>
>> Hope this helps,
>> Christian
>
>