asp.net web api 2 for mvc developers pdf : C# merge pdf pages application software utility html windows azure visual studio mongodb_%20the%20definitive%20guide%20-%20kristina%20chodorow_140113-part1757

CHAPTER 6
Special Index and Collection Types
This chapter covers the special collections and index types MongoDB has available,
including:
• Capped collections for queue-like data
• TTL indexes for caches
• Full-text indexes for simple string searching
• Geospatial indexes for 2D and spherical geometries
• GridFS for storing large files
Capped Collections
“Normal” collections in MongoDB are created dynamically and automatically grow in
size to fit additional data. MongoDB also supports a different type of collection, called
capped collection, which is created in advance and is fixed in size (see Figure 6-1).
Having fixed-size collections brings up an interesting question: what happens when we
try to insert into a capped collection that is already full? The answer is that capped
collections behave like circular queues: if we’re out of space, the oldest document will
be deleted, and the new one will take its place (see Figure 6-2). This means that capped
collections automatically age-out the oldest documents as new documents are inserted.
Certain operations are not allowed on capped collections. Documents cannot be re‐
moved or deleted (aside from the automatic age-out described earlier), and updates that
would cause documents to grow in size are disallowed. By preventing these two oper‐
ations, we guarantee that documents in a capped collection are stored in insertion order
and that there is no need to maintain a free list for space from removed documents.
109
C# merge pdf pages - Merge, append PDF files in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Provide C# Demo Codes for Merging and Appending PDF Document
pdf merge files; pdf combine files online
C# merge pdf pages - VB.NET PDF File Merge Library: Merge, append PDF files in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
VB.NET Guide and Sample Codes to Merge PDF Documents in .NET Project
append pdf; c# merge pdf files into one
Figure 6-1. New documents are inserted at the end of the queue
Figure 6-2. When the queue is full, the oldest element will be replaced by the newest
110 | Chapter 6: Special Index and Collection Types
C# PDF Page Insert Library: insert pages into PDF file in C#.net
how to merge PDF document files by C# code, how to rotate PDF document page, how to delete PDF page using C# .NET, how to reorganize PDF document pages and how
acrobat reader merge pdf files; acrobat merge pdf files
C# PDF Page Delete Library: remove PDF pages in C#.net, ASP.NET
Provide C# Users with Mature .NET PDF Document Manipulating Library for Deleting PDF Pages in C#. Demo Code: How to Delete Consecutive Pages from PDF in C#.NET.
best pdf combiner; split pdf into multiple files
Capped collections have a different access pattern than most MongoDB collections: data
is written sequentially over a fixed section of disk. This makes them tend to perform
writes quickly on spinning disk, especially if they can be given their own disk (so as not
to be “interrupted” by other collections’ random writes).
Capped collections cannot be sharded.
Capped collections tend to be useful for logging, although they lack flexibility: you
cannot control when data ages out, other than setting a size when you create the
collection.
Creating Capped Collections
Unlike normal collections, capped collections must be explicitly created before they are
used. To create a capped collection, use the create command. From the shell, this can
be done using createCollection:
> db.createCollection("my_collection", {"capped" : true"size" : 100000});
"ok" : true }
The previous command creates a capped collection, my_collection, that is a fixed size
of 100,000 bytes.
createCollection can also specify a limit on the number of documents in a capped
collection in addition to the limit size:
> db.createCollection("my_collection2"
... {"capped" : true"size" : 100000, "max" : 100});
"ok" : true }
You could use this to keep, say, the latest 10 news articles or limit a user to 1,000
documents.
Once a capped collection has been created, it cannot be changed (it must be dropped
and recreated if you wish to change its properties). Thus, you should think carefully
about the size of a large collection before creating it.
When limiting the number of documents in a capped collection, you
must specify a size limit as well. Age-out will be based on whichever
limit is reached first: it cannot hold more than "max" documents nor
take up more than "size" space.
Capped Collections | 111
C# PDF File & Page Process Library SDK for C#.net, ASP.NET, MVC
C#: Convert PDF to HTML; C#: Convert PDF to Jpeg; C# File: Compress PDF; C# File: Merge PDF; C# File: Split PDF; C# Page: Insert PDF pages; C# Page: Delete PDF
merge pdf; acrobat combine pdf files
C# PDF Page Extract Library: copy, paste, cut PDF pages in C#.net
Easy to Use C# Code to Extract PDF Pages, Copy Pages from One PDF File and Paste into Others in C#.NET Program. C#.NET Project DLLs: Copy and Paste PDF Pages.
add pdf together; pdf combine two pages into one
Another option for creating a capped collection is to convert an existing, regular col‐
lection into a capped collection. This can be done using the convertToCapped
command—in the following example, we convert the test collection to a capped collec‐
tion of 10,000 bytes:
> db.runCommand({"convertToCapped" : "test""size" : 10000});
"ok" : true }
There is no way to “uncap” a capped collection (other than dropping it).
Sorting Au Naturel
There is a special type of sort that you can do with capped collections, called a natural
sort. A natural sort returns the documents in the order that they appear on disk (see
Figure 6-3).
For most collections, this isn’t a very useful sort because documents move around.
However, documents in a capped collection are always kept in insertion order so that
natural order is the same as insertion order. Thus, a natural sort gives you documents
from oldest to newest. You can also sort from newest to oldest (see Figure 6-4):
> db.my_collection.find().sort({"$natural" : -1})
Figure 6-3. Sort by {"$natural” : 1}
112 | Chapter 6: Special Index and Collection Types
VB.NET PDF Page Delete Library: remove PDF pages in vb.net, ASP.
Page: Delete Existing PDF Pages. |. Home ›› XDoc.PDF ›› VB.NET PDF: Delete PDF Page. How to VB.NET: Delete Consecutive Pages from PDF.
batch merge pdf; add pdf pages together
VB.NET PDF Page Insert Library: insert pages into PDF file in vb.
you want to read the tutorial of PDF page adding in C# class, we suggest you go to C# Imaging - how Add and Insert Multiple PDF Pages to PDF Document Using VB.
reader create pdf multiple files; how to combine pdf files
Figure 6-4. Sort by {"$natural” : -1}
Tailable Cursors
Tailable cursors are a special type of cursor that are not closed when their results are
exhausted. They were inspired by the tail -f command and, similar to the command,
will continue fetching output for as long as possible. Because the cursors do not die
when they run out of results, they can continue to fetch new results as documents are
added to the collection. Tailable cursors can be used only on capped collections, since
insert order is not tracked for normal collections.
Tailable cursors are often used for processing documents as they are inserted onto a
“work queue” (the capped collection). Because tailable cursors will time out after 10
minutes of no results, it is important to include logic to re-query the collection if they
die. The mongo shell does not allow you to use tailable cursors, but using one in PHP
looks something like the following:
$cursor = $collection->find()->tailable();
while (true) {
if (!$cursor->hasNext()) {
if ($cursor->dead()) {
break;
}
sleep(1);
}
else {
while ($cursor->hasNext()) {
Capped Collections | 113
C# PDF Page Rotate Library: rotate PDF page permanently in C#.net
page, it is also featured with the functions to merge PDF files using C# .NET, add new PDF page, delete certain PDF page, reorder existing PDF pages and split
merge pdf online; pdf merge comments
C# PDF Convert to Jpeg SDK: Convert PDF to JPEG images in C#.net
Output.jpg"); Following demo code will show how to convert all PDF pages to Jpeg images with C# .NET. // Load a PDF file. String
append pdf files reader; acrobat split pdf into multiple files
do_stuff($cursor->getNext());
}
}
}
The cursor will process results or wait for more results to arrive until the cursor dies (it
will time out if there are no inserts for 10 minutes or someone kills the query operation).
No-_id Collections
By default, every collection has an "_id" index. However, you can create collections
with "_id" indexes by setting the autoIndexId option to false when calling createCol
lection. This is not recommended but can give you a slight speed boost on an insert-
only collection.
If you create a collection without an "_id" index, you will never be able
replicate the mongod it lives on. Replication requires the "_id" index
on every collection (it is important that replication can uniquely iden‐
tify each document in a collection).
Capped collections prior to version 2.2 did not have an "_id" index unless autoIndex
Id was explicitly set to true. If you are working with an “old” capped collection, ensure
that your application is populating the "_id" field (most drivers will do this automati‐
cally) and then create the "_id" index using ensureIndex.
Remember to make the "_id" index unique. Do a practice run before creating the index
in production, as unlike other indexes, the "_id" index cannot be dropped once created.
Thus, you must get it right the first time! If you do not, you cannot change it without
dropping the collection and recreating it.
Time-To-Live Indexes
As mentioned in the previous section, capped collections give you limited control over
when their contents are overwritten. If you need a more flexible age-out system, time-
to-live (TTL) indexes allow you to set a timeout for each document. When a document
reaches a preconfigured age, it will be deleted. This type of index is useful for caching
problems like session storage.
You can create a TTL index by specifying the expireAfterSecs option in the second
argument to ensureIndex:
> // 24-hour timeout
> db.foo.ensureIndex({"lastUpdated" : 1}, {"expireAfterSecs" : 60*60*24})
114 | Chapter 6: Special Index and Collection Types
This creates a TTL index on the "lastUpdated" field. If a document’s "lastUpdated"
field exists and is a date, the document will be removed once the server time is expir
eAfterSecs seconds ahead of the document’s time.
To prevent an active session from being removed, you can update the "lastUpdated"
field to the current time whenever there is activity. Once "lastUpdated" is 24 hours
old, the document will be removed.
MongoDB sweeps the TTL index once per minute, so you should not depend on to-
the-second granularity. You can change the expireAfterSecs using the collMod
command:
> db.runCommand({"collMod" : "someapp.cache""expireAfterSecs" : 3600})
You can have multiple TTL indexes on a given collection. They cannot be compound
indexes but can be used like “normal” indexes for the purposes of sorting and query
optimization.
Full-Text Indexes
MongoDB has a special type of index for searching for text within documents. In pre‐
vious chapters, we’ve queried for strings using exact matches and regular expressions,
but these techniques have some limitations. Searching a large block of text for a regular
expression is slow and it’s tough to take linguistic issues into account (e.g., that “entry”
should match “entries”). Full-text indexes give you the ability to search text quickly, as
well as provide built-in support for multi-language stemming and stop words.
While all indexes are expensive to create, full-text indexes are particularly heavyweight.
Creating a full-text index on a busy collection can overload MongoDB, so adding this
type of index should always be done offline or at a time when performance does not
matter. You should be wary of creating full-text indexes that will not fit in RAM (unless
you have SSDs). See Chapter 18 for more information on creating indexes with minimal
impact on your application.
Full-text search will also incur more severe performance penalties on writes than “nor‐
mal” indexes, since all strings must be split, stemmed, and stored in a few places. Thus,
you will tend to see poorer write performance on full-text-indexed collections than on
others. It will also slow down data movement if you are sharding: all text must be rein‐
dexed when it is migrated to a new shard.
As of this writing, full text indexes are an “experimental” feature, so you must enable
them specifically. You can either start MongoDB with the --setParameter textSearch
Enabled=true option or set it at runtime by running the setParameter command:
> db.adminCommand({"setParameter" : 1"textSearchEnabled" : true})
Full-Text Indexes | 115
Suppose we use the unofficial Hacker News JSON API to load some recent stories into
MongoDB.
To run a search over the text, we first need to create a "text" index:
> db.hn.ensureIndex({"title" : "text"})
Now, to use the index, we must use the text command (as of this writing, full text indexes
cannot be used with “normal” queries):
test> db.runCommand({"text" : "hn""search" : "ask hn"})
{
"queryDebugString" : "ask|hn||||||",
"language" : "english",
"results" : [
{
"score" : 2.25,
"obj" : {
"_id" : ObjectId("50dcab296803fa7e4f000011"),
"title" : "Ask HN: Most valuable skills you have?",
"url" : "/comments/4974230",
"id" : 4974230,
"commentCount" : 37,
"points" : 31,
"postedAgo" : "2 hours ago",
"postedBy" : "bavidar"
}
},
{
"score" : 0.5625,
"obj" : {
"_id" : ObjectId("50dcab296803fa7e4f000001"),
"title" : "Show HN: How I turned an old book...",
"url" : "http://www.howacarworks.com/about",
"id" : 4974055,
"commentCount" : 44,
"points" : 95,
"postedAgo" : "2 hours ago",
"postedBy" : "AlexMuir"
}
},
{
"score" : 0.5555555555555556,
"obj" : {
"_id" : ObjectId("50dcab296803fa7e4f000010"),
"title" : "Show HN: ShotBlocker - iOS Screenshot detector...",
"url" : "https://github.com/clayallsopp/ShotBlocker",
"id" : 4973909,
"commentCount" : 10,
"points" : 17,
"postedAgo" : "3 hours ago",
"postedBy" : "10char"
}
116 | Chapter 6: Special Index and Collection Types
}
],
"stats" : {
"nscanned" : 4,
"nscannedObjects" : 0,
"n" : 3,
"timeMicros" : 89
},
"ok" : 1
}
The matching documents are returned in order of decreasing relevance: “Ask HN” is
first, then two “Show HN” partial matches. The "score" field before each object de‐
scribes how closely the result matched the query.
As you can see from the results, the search is case insensitive, at least for characters in
[a-zA-Z]. Full-text indexes use toLower to lowercase words, which is locale-dependant,
so users of other languages may find MongoDB unpredictably case sensitive, depending
on how toLower behaves on their character set. Better collation support is in the works.
Full text indexes only index string data: other data types are ignored and not included
in the index. Only one full-text index is allowed per collection, but it may contain mul‐
tiple fields:
> db.blobs.ensureIndex({"title" : "text""desc" : "text""author" : "text"})
This is not like “nomal” multikey indexes where there is an ordering on the keys: each
field is given equal consideration. You can control the relative importance MongoDB
attaches to each field by specifying a weight:
> db.hn.ensureIndex({"title" : "text""desc" : "text""author" : "text"}, 
... {"weights" : {"title" : 3"author" : 2}})
The default weight is 1, and you may use weights from 1 to 1 billion. The weights above
would weight "title" fields the most, followed by "author" and then "desc" (not
specified in the weight list, so given a default weight of 1).
You cannot change field weights after index creation (without dropping the index and
recreating it), so you may want to play with weights on a sample data set before creating
the index on your production data.
For some collections, you may not know which fields a document will contain. You can
create a full-text index on all string fields in a document by creating an index on
"$**": this not only indexes all top-level string fields, but also searches embedded
documents and arrays for string fields:
> db.blobs.ensureIndex({"$**" : "text"})
You can also give "$**" a weight:
> db.hn.ensureIndex({"whatever" : "text"}, 
... {"weights" : {"title" : 3"author" : 1"$**" : 2}})
Full-Text Indexes | 117
"whatever" can be anything since it is not used. As the weights specify that you’re
indexing all fields, MongoDB does not require you to give a field list.
Search Syntax
By default, MongoDB queries for an OR of all the words: “ask OR hn”. This is the most
efficient way to perform a full text query, but you can also do exact phrase searches and
NOT. To search for the exact phrase “ask hn”, you can query for that by including the
query in quotes:
> db.runCommand({text: "hn"search: "\"ask hn\""})
{
"queryDebugString" : "ask|hn||||ask hn||",
"language" : "english",
"results" : [
{
"score" : 2.25,
"obj" : {
"_id" : ObjectId("50dcab296803fa7e4f000011"),
"title" : "Ask HN: Most valuable skills you have?",
"url" : "/comments/4974230",
"id" : 4974230,
"commentCount" : 37,
"points" : 31,
"postedAgo" : "2 hours ago",
"postedBy" : "bavidar"
}
}
],
"stats" : {
"nscanned" : 4,
"nscannedObjects" : 0,
"n" : 1,
"nfound" : 1,
"timeMicros" : 20392
},
"ok" : 1
}
This is slower than the OR-type match, since MongoDB first performs an OR match
and then post-processes the documents to ensure that they are AND matches, as well.
You can also make part of a query literal and part not:
> db.runCommand({text: "hn"search: "\"ask hn\" ipod"})
This will search for exactly "ask hn" and, optionally, "ipod".
You can also search for not including a certain string by using "-":
> db.runCommand({text: "hn"search: "-startup vc"})
118 | Chapter 6: Special Index and Collection Types
Documents you may be interested
Documents you may be interested