Pages

Friday, 13 April 2012

Linux vps下安装MongoDB

 MongoDB 是一个基于分布式文件存储的数据库,是 NoSQL 的成员之一,NoSQL 即 Not Only SQL 简而言之就是反 SQL 关系型数据库的运动,倡导用非关系型的数据存储,相对于臃肿强大的关系型数据库,非关系型数据库的优点不言而喻。MongoDB 就是其中的佼佼者。

怎么在Linux系统下安装 MongoDB数据库呢?根据以下的三个步骤你就可以在你的Linux下成功安装MongoDB。
步骤一:下载文件

对于32位的linux
$ curl http://downloads.mongodb.org/linux/mongodb-linux-i686-1.4.4.tgz > mongo.tgz
$ tar xzf mongo.tgz

对于64位的linux
$ curl http://downloads.mongodb.org/linux/mongodb-linux-x86_64-1.4.4.tgz > mongo.tgz
$ tar xzf mongo.tgz
如果没有安装curl
先安装apt-get install curl
步骤二:创建数据文件夹

默认情况下,MongoDB会在/data/db/这个文件夹存放数据,这个文件夹需要自己手动创建。
通过如下方式创建:

$ adduser mongodb
$ passwd mongodb
$ sudo mkdir -p /data/db/
$ sudo chown `id -u` /data/db
$ chown -R mongodb:mongodb /data
当然 可以 通过--dbpath 命令 指定MongoDB将数据存储到另外的目录中去。
步骤三:让数据库运行起来

在控制台中:
$ nohup ./mongodb-xxxxxxx/bin/mongod &
$ ./mongodb-xxxxxxx/bin/mongo
> db.foo.save( { a : 1 } )
> db.foo.find()

结果是:
{ "_id" : ObjectId("4cd181a31415ffb41a094f43"), "a" : 1 }

以上的三个步骤就OK了!! 这样一个简单的MongoDB数据库就可以畅通无阻得运行起来了。
---------------------------------------------------------------------

MongoDB简介及安装

MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。Mongo使用C++开发。Mongo的官方网站地址是:http://www.mongodb.org/,读者可以在此获得更详细的信息。
小插曲:什么是NoSql?
NoSql,全称是 Not Only Sql,指的是非关系型的数据库。下一代数据库主要解决几个要点:非关系型的、分布式的、开源的、水平可扩展的。原始的目的是为了大规模web应用,这场 运动开始于2009年初,通常特性应用如:模式自由、支持简易复制、简单的API、最终的一致性(非ACID)、大容量数据等。NoSQL被我们用得最多 的当数key-value存储,当然还有其他的文档型的、列存储、图型数据库、xml数据库等。
特点:
高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
  • 面向集合存储,易存储对象类型的数据。
  • 模式自由。
  • 支持动态查询。
  • 支持完全索引,包含内部对象。
  • 支持查询。
  • 支持复制和故障恢复。
  • 使用高效的二进制数据存储,包括大型对象(如视频等)。
  • 自动处理碎片,以支持云计算层次的扩展性
  • 支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。
  • 文件存储格式为BSON(一种JSON的扩展)。
  • 可通过网络访问。
功能:
  • 面向集合的存储:适合存储对象及JSON形式的数据。
  • 动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • 完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
  • 查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。
  • 复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。
  • 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
  • 自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。
适用场合:
  • 网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
  • 缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源 过载。
  • 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
  • 高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。
  • 用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。

三、下载安装和配置

安装Mongo数据库:
在发布本文的时间官方提供的最新版本是:1.6.5 ,如果不做特殊声明,本教程所用的版本将会是这个版本。
  1. 第一步:下载安装包:官方下载地址←单击此处,如果是win系统,注意是64位还是32位版本的,请选择正确的版本。
  2. 第二步:新建目录“D:\MongoDB”,解压下载到的安装包,找到bin目录下面全部.exe文件,拷贝到刚创建的目录下。
  3. 第三步:在“D:\MongoDB”目录下新建“data”文件夹,它将会作为数据存放的根文件夹。
配置Mongo服务端:
打开CMD窗口,按照如下方式输入命令:
> d:
> cd D:\MongoDB
> mongod --dbpath D:\MongoDB\data


在浏览器输入:http://localhost:27017/,可以看到如下提示:
You are trying to access MongoDB on the native driver port. For http diagnostic access, add 1000 to the port number
如此,MongoDB数据库服务已经成功启动了。
-----------------------------------------------------------------
mongodb常用命令  

其野心所在就是海量数据的处理。关于它的一个最简洁描述为:scalable, high-performance, open source, schema-free, document-oriented databaseMongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。    
安装及使用:
首先在Ubuntu上安装MongoDB
下载MongoDB, 现在最新的生产版本1.7.0
1.                   解压文件.
$ tar -xvf mongodb-linux-i686-1.4.3.tgz
2.                  MongoDB创建数据目录,默认情况下它将数据存储在/data/db
$ sudo mkdir -p /data/db/
$ sudo chown `id -u` /data/db
3.                  启动MongoDB服务.
$ cd mongodb-linux-i686-1.4.3/bin
$ ./mongod
4.                  打开另一个终端,并确保你在MongoDBbin目录,输入如下命令.
$ ./mongo

一些概念

一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个collection可以存放多个文档(document),每个文档都以BSONbinary json)的形式存放于硬盘中,因此可以存储比较复杂的数据类型。它是以单文档为单位存储的,你可以任意给一个或一批文档新增或删除字段,而不会对其它文档造成影响,这就是所谓的schema-free,这也是文档型数据库最主要的优点。跟一般的key-value数据库不一样的是,它的value中存储了结构信息,所以你又可以像关系型数据库那样对某些域进行读写、统计等操作。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。Mongo还可以解决海量数据的查询效率,根据官方文档,当数据量达到50GB以上数据时,Mongo数据库访问速度是MySQL10 倍以上。
BSON
BSONBinary JSON 的简称,是一个JSON文档对象的二进制编码格式。BSONJSON一样支持往其它文档对象和数组中再插入文档对象和数组,同时扩展了JSON的数据类型。如:BSONDate类型和BinDate类型。
BSON被比作二进制的交换格式,如同Protocol Buffers,但BSON比它更“schema-less”,非常好的灵活性但空间占用稍微大一点。
BSON有以下三个特点:
1.  轻量级
2.  跨平台
3.  效率高
命名空间
MongoDB存储BSON对象到collections,这一系列的数据库名和collection名被称为一个命名空间。如同:java.util.List;用来管理数据库中的数据。

索引

mongodb可以对某个字段建立索引,可以建立组合索引、唯一索引,也可以删除索引,建立索引就意味着增加空间开销。默认情况下每个表都会有一个唯一索引:_id,如果插入数据时没有指定_id,服务会自动生成一个_id,为了充分利用已有索引,减少空间开销,最好是自己指定一个uniquekey_id,通常用对象的ID比较合适,比如商品的ID

shell操作数据库:

   1.  超级用户相关:
         1. #进入数据库admin
use admin
         2. #增加或修改用户密码
          db.addUser('name','pwd')
         3. #查看用户列表
          db.system.users.find()
         4. #用户认证
          db.auth('name','pwd')
         5. #删除用户
          db.removeUser('name')
         6. #查看所有用户
          show users
         7. #查看所有数据库
          show dbs
         8. #查看所有的collection
          show collections
         9. #查看各collection的状态
          db.printCollectionStats()
        10. #查看主从复制状态
          db.printReplicationInfo()
        11. #修复数据库
          db.repairDatabase()
        12. #设置记录profiling0=off 1=slow 2=all
          db.setProfilingLevel(1)
        13. #查看profiling
          show profile
        14. #拷贝数据库
          db.copyDatabase('mail_addr','mail_addr_tmp')
        15. #删除collection
          db.mail_addr.drop()
        16. #删除当前的数据库
          db.dropDatabase()
       
   2. 增删改
         1. #存储嵌套的对象
db.foo.save({'name':'ysz','address':{'city':'beijing','post':100096},'phone':[138,139]})

         2. #存储数组对象
db.user_addr.save({'Uid':'yushunzhi@sohu.com','Al':['test-1@sohu.com','test-2@sohu.com']})

         3. #根据query条件修改,如果不存在则插入,允许修改多条记录
            db.foo.update({'yy':5},{'$set':{'xx':2}},upsert=true,multi=true)
         4. #删除yy=5的记录
            db.foo.remove({'yy':5})
         5. #删除所有的记录
            db.foo.remove()

   3. 索引
         1. #增加索引:1(ascending),-1(descending)
         2. db.foo.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
         3. #索引子对象
         4. db.user_addr.ensureIndex({'Al.Em': 1})
         5. #查看索引信息
         6. db.foo.getIndexes()
         7. db.foo.getIndexKeys()
         8. #根据索引名删除索引
         9. db.user_addr.dropIndex('Al.Em_1')

   4. 查询
         1. #查找所有
        2. db.foo.find()
        3. #查找一条记录
        4. db.foo.findOne()
        5. #根据条件检索10条记录
        6. db.foo.find({'msg':'Hello 1'}).limit(10)
        7. #sort排序
        8. db.deliver_status.find({'From':'ixigua@sina.com'}).sort({'Dt',-1})
         9. db.deliver_status.find().sort({'Ct':-1}).limit(1)
        10. #count操作
        11. db.user_addr.count()
        12. #distinct操作,查询指定列,去重复
        13. db.foo.distinct('msg')
        14. #”>=”操作
        15. db.foo.find({"timestamp": {"$gte" : 2}})
        16. #子对象的查找
        17. db.foo.find({'address.city':'beijing'})
   5. 管理
         1. #查看collection数据的大小
         2. db.deliver_status.dataSize()
         3. #查看colleciont状态
         4. db.deliver_status.stats()
         5. #查询所有索引的大小
         6. db.deliver_status.totalIndexSize()

5.  advanced queries:高级查询

条件操作符
$gt : >
$lt : <
$gte: >=
$lte: <=
$ne : !=
<>
$in : in
$nin: not in
$all: all
$not:
反匹配(1.3.3及以上版本)

查询 name <> "bruce" and age >= 18 的数据
db.users.find({name: {$ne: "bruce"}, age: {$gte: 18}});

查询 creation_date > '2010-01-01' and creation_date <= '2010-12-31' 的数据
db.users.find({creation_date:{$gt:new Date(2010,0,1), $lte:new Date(2010,11,31)});

查询 age in (20,22,24,26) 的数据
db.users.find({age: {$in: [20,22,24,26]}});

查询 age取模10等于0 的数据
db.users.find('this.age % 10 == 0');
或者
db.users.find({age : {$mod : [10, 0]}});

匹配所有
db.users.find({favorite_number : {$all : [6, 8]}});
可以查询出{name: 'David', age: 26, favorite_number: [ 6, 8, 9 ] }
可以不查询出{name: 'David', age: 26, favorite_number: [ 6, 7, 9 ] }

查询不匹配name=B*带头的记录
db.users.find({name: {$not: /^B.*/}});
查询 age取模10不等于0 的数据
db.users.find({age : {$not: {$mod : [10, 0]}}});

#
返回部分字段
选择返回age_id字段(_id字段总是会被返回)
db.users.find({}, {age:1});
db.users.find({}, {age:3});
db.users.find({}, {age:true});
db.users.find({ name : "bruce" }, {age:1});
0
false, 0true

选择返回ageaddress_id字段
db.users.find({ name : "bruce" }, {age:1, address:1});

排除返回ageaddress_id字段
db.users.find({}, {age:0, address:false});
db.users.find({ name : "bruce" }, {age:0, address:false});

数组元素个数判断
对于{name: 'David', age: 26, favorite_number: [ 6, 7, 9 ] }记录
匹配db.users.find({favorite_number: {$size: 3}});
不匹配db.users.find({favorite_number: {$size: 2}});

$exists
判断字段是否存在
查询所有存在name字段的记录
db.users.find({name: {$exists: true}});
查询所有不存在phone字段的记录
db.users.find({phone: {$exists: false}});

$type
判断字段类型
查询所有name字段是字符类型的
db.users.find({name: {$type: 2}});
查询所有age字段是整型的
db.users.find({age: {$type: 16}});

对于字符字段,可以使用正则表达式
查询以字母b或者B带头的所有记录
db.users.find({name: /^b.*/i});

$elemMatch(1.3.1
及以上版本)
为数组的字段中匹配其中某个元素

Javascript
查询和$where查询
查询 age > 18 的记录,以下查询都一样
db.users.find({age: {$gt: 18}});
db.users.find({$where: "this.age > 18"});
db.users.find("this.age > 18");
f = function() {return this.age > 18} db.users.find(f);

排序sort()
以年龄升序asc
db.users.find().sort({age: 1});
以年龄降序desc
db.users.find().sort({age: -1});

限制返回记录数量limit()
返回5条记录
db.users.find().limit(5);
返回3条记录并打印信息
db.users.find().limit(3).forEach(function(user) {print('my age is ' + user.age)});
结果
my age is 18
my age is 19
my age is 20

限制返回记录的开始点skip()
从第3条记录开始,返回5条记录(limit 3, 5)
db.users.find().skip(3).limit(5);

查询记录条数count()
db.users.find().count();
db.users.find({age:18}).count();
以下返回的不是5,而是user表中所有的记录数量
db.users.find().skip(10).limit(5).count();
如果要返回限制之后的记录数量,要使用count(true)或者count(0)
db.users.find().skip(10).limit(5).count(true);

分组group()
假设test表只有以下一条数据
{ domain: "www.mongodb.org"
, invoked_at: {d:"2009-11-03", t:"17:14:05"}
, response_time: 0.05
, http_action: "GET /display/DOCS/Aggregation"
}
使用group统计test11月份的数据count:count(*)total_time:sum(response_time)avg_time:total_time/count;
db.test.group(
{ cond: {"invoked_at.d": {$gt: "2009-11", $lt: "2009-12"}}
, key: {http_action: true}
, initial: {count: 0, total_time:0}
, reduce: function(doc, out){ out.count++; out.total_time+=doc.response_time }
, finalize: function(out){ out.avg_time = out.total_time / out.count }
} );

[
{
"http_action" : "GET /display/DOCS/Aggregation",
"count" : 1,
"total_time" : 0.05,
"avg_time" : 0.05
}
]


Java 应用示例
要使用Java操作MongoDB的话,要到官方网站下载一个驱动包,把包导入后,可以尝试来操作了(记得一定要开着服务器)
首先介绍一下比较常用的几个类
Mongo:连接服务器,执行一些数据库操作的选项,如新建立一个数据库等
DB:对应一个数据库,可以用来建立集合等操作
DBCollection:对应一个集合(类似表),可能是我们用得最多的,可以添加删除记录等
DBObjec:接口和BasicDBObject对象:表示一个具体的记录,BasicDBObject实现了DBObject,因为是key-value的数据结构,所以用起来其实和HashMap是基本一致的
DBCursor:用来遍历取得的数据,实现了IterableIterator
接下来实际的操作一下,代码如下:
import java.net.UnknownHostException;
import java.util.List;
import java.util.Set;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
public class MongoDbTest {
  public static void main(String[] args) throws UnknownHostException, MongoException {
    //Mongo m = new Mongo();
//Mongo m = new Mongo("localhost");
//获得数据库服务
Mongo m = new Mongo("localhost", 27017);
//得到数据库mytest
DB db = m.getDB("mytest");
//得到mytest数据库下所有表名
    Set<String> colls = db.getCollectionNames();
    for (String s : colls) {
        System.out.println(s);
}
//得到testCollection
DBCollection coll = db.getCollection("testCollection");
//new 一个BasicDBObject对象doc
BasicDBObject doc = new BasicDBObject();
//赋值
    doc.put("name", "MongoDB");
    doc.put("type", "database");
doc.put("count", 1);
//new 一个BasicDBObject对象info
    BasicDBObject info = new BasicDBObject();
    info.put("x", 203);
info.put("y", 102);
//info放入doc
doc.put("info", info);
//testCollection表中插入一条数据
coll.insert(doc);
//查询一条数据
    DBObject myDoc = coll.findOne();
    System.out.println(myDoc);
   
    //循环插入100条数据到testCollection
    for (int i=0; i < 100; i++) {
      coll.insert(new BasicDBObject().append("i", i));
    }
   
   
    //Counting Documents in A Collection
    System.out.println(coll.getCount());
   
    //Using a Cursor to Get All the Documents
    DBCursor cur = coll.find();
    while(cur.hasNext()) {
--------------------------------------------------------------
 CENTOS/FEDORA下安装mongodb

在centos 6 64位下安装mongodb server服务器和mongodb client客户端,直接使用
yum install mongodb会发现没有相应的安装包。
需要添加一个repos,对于32bit的需要添加下面的安装源:
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686
gpgcheck=0
对于64位的添加的安装源
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0

然后运行下面命令
yum install mongo-10gen mongo-10gen-server
安装成功后,配置/etc/mongod.conf的bind_ip以及设置权限
chown -R mongod:mongod /var/lib/mongo/
然后启动mongodb
service mongod start
mongodb默认端口是27017
-----------------------------------
非关系型数据库的研究与实践

最近对MongoDB进行了一些研究,我认为其很实用,很有发展前途。

对于关系数据库的使用,大家普遍认为JOIN操作开销很大,所以在设计的过程中,就极力避免这类操作。
一般在设计上遵循了关系数据库中“范式”的概念,而操作数据大部分都是针对单表的。
即使有JOIN的需求,也是通过应用程序分两步或多步获取数据。
以“私信”应用的收件箱为例(以下设计有简化):
收件箱:
create table inbox(
uid int unsigned not null,    //收件人的uid
mid int unsigned not null,    //私信的唯一标识mid
time timestamp not null default current_timestamp, //收信时间
primary key(uid,mid)
)engine=innodb;
信件内容:
create table msg(
mid int unsigned not null auto_increment, //私信的唯一标识mid
content blob not null,    //私信内容
primary key(mid)
)engine=innodb;
如果使用JOIN来获取消息列表:
select inbox.mid,inbox.time,msg.content from inbox join msg on inbox.mid=msg.mid where inbox.uid=:uid order by inbox.mid desc limit 10;
如此使用JOIN操作,不利于两个数据表的拆分。

 一般情况,我们会msg数据表中的数据根据mid进行拆分并使用Memcache等进行缓存。 而对于inbox数据表,我们会根据uid进行拆分。 这样我们的应用程序需要分两步获取最终列表数据:
1,select mid from inbox where uid=:uid order by mid limit 10;
2,使用上一步获得的mid,在Memcache中获取content数据。

根据我的经验,大部分现代互联网应用,并没有将关系数据库当作一个“关系”数据库来使用。

MongoDB基本实现了我们对于数据库中单表操作的所有需求,并且在某些方面有独特的优势。
 以下简单列举MongoDB的一些特性:
1,在MongoDB中,一条数据以JSON编码的字符串体现,以BSON编码的数据存储。
2,由于其存储格式灵活,所以增删数据列,无需漫长的alter table操作。
3,每个数据表(在MongoDB中叫做Collection)都需要有主键。
4,支持Secondary index,支持多列索引(where a=1 and b=2),支持排序( order by time desc)。
5,使用简单的的非SQL指令对数据进行CRUD操作,并支持丰富的操作符,比如$inc对某一列数值进行增加操作。
6,实现简单master-slave复制,也支持Replica Sets(自动选举master)。
7,实现自动数据切分 auto sharding。
8,实现了简单的data proxy功能,数据拆分对应用透明。
 以上大部分特性是我们在实际应用中对数据库管理系统(DBMS)最实用、最迫切的需求。
更重要的是,MongoDB使用C++语言编写,源代码只有1.5M左右,相对于MySQL的30M的源代码,更容易学习和维护。
通过我对多种号称“NOSQL”的非关系型数据库系统的研究,我认为MongoDB是最实用、最有前途的产品之一。
目前有独立的公司(10gen)为mongoDB提供商业技术支持,已经有数百家互联网公司在生产环境中部署MongoDB。

非关系型数据库是未来互联网应用中的一个技术趋势,我们要在将来能够立足,就必须未雨绸缪。
所以我认为我们应该从现在开始学习,并逐步在实践中积累经验。
目前MongoDB的学习资料主要有:
1,官方文档: http://www.mongodb.org/display/DOCS/Home
2,O'Reilly出版的权威指南: http://oreilly.com/catalog/0636920001096
当然,最好的学习途径就是实践,最好能够找一个应用来实战。
通过实战,可以在部署、开发、运维等方面积累最宝贵的经验.
 ------------------------------------------------------------------

Compile mongoDB on FreeBSD


I’ve chosen MongoDB, which is a pretty widely used but new NOSQL solution.
First I wanted to install on my US based VPS, but it would need to upgrade/reinstall my whole system, because the latest versions needed the latest gcc 4.6 and libc6 upgrade, and spidermonkey, PCRE, and blah-blah…

So I ended up with installing on my production FreeBSD server, which is a bit old. It’s a 6.2 RELENG one, what is unsupported now. It also need some upgrades, and yeah a gcc upgrade as well, but finally, when I thought it will end shortly I got this error, which I’ve never seen before, and couldn’t handle at first sight.
1
2
3
4
5
6
7
/usr/local/bin/ld: db/matcher.o: undefined reference to symbol 'pcre_config'
/usr/local/bin/ld: note: 'pcre_config' is defined in DSO //usr/local/lib/libpcre.so.1 so try adding it to the linker command line
//usr/local/lib/libpcre.so.1: could not read symbols: Invalid operation
[2012. 05. 17. 15:48:34] Lakatos Zsolt: collect2: ld returned 1 exit status
scons: *** [mongodump] Error 1
scons: building terminated because of errors.
*** Error code 2
Now what shall we do with the drunken sailor?
First I thought about reinstalling and recompiling PCRE, which I did, and doesn’t solve this issue.
After an hour of trying different things, I’ve copied the whole c++ command and added -lpcre as a library to link against. And it worked… But, how can I get this horrible Scons stuff to link with PCRE…
I’ve started to dig in SConstuct file, then I’ve found execinfo checking part, which was the last one in the linking row. And I thought what if I just add another array element at this point for pcre.
And I ended up a config like this:
1
2
3
         myCheckLib( "execinfo", True )
         env.Append( LIBS=[ "execinfo" ] )
         env.Append( LIBS=[ "pcre" ] )
After I did this I’ve tried to make the package again, and finally, after 2 days it ended up well, and I’ve installed mongodb.
1
# diff -Naru SConstruct SConstruct.patched
Then I’ve created a patch for this, just to document this really dirty solution to help anybody who ran into an error like me.
So the whole patch is here:
1
2
3
4
5
6
7
8
9
10
--- SConstruct  Fri May 18 14:21:32 2012
+++ SConstruct.patched  Fri May 18 14:22:29 2012
@@ -956,6 +956,7 @@
     if freebsd or openbsd:
         myCheckLib( "execinfo", True )
         env.Append( LIBS=[ "execinfo" ] )
+        env.Append( LIBS=[ "pcre" ] )

     # Handle staticlib,staticlibpath options.
     staticlibfiles = []

 from http://djzone.im/2012/05/compile-mongodb-on-freebsd/

 related post: http://briteming.blogspot.co.uk/2013/05/mongodb.html