所以我有这个简单的登录功能,试图将电子邮件地址与数据库中的密码匹配,并通过表单将其与用户输入的数据进行比较.
function login($email, $password){
$m = new Mongo("localhost");
$m->connect();
$db = $m->users;
$collection = $db->test_collection;
echo "<pre>";
var_dump($collection->findOne(array('name' => 'john'))); //returns correctly
var_dump($collection->find(array('name' => 'john'))); //returns mongo cursor object
echo "</pre>";
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么find()只返回一个游标对象.答案?
这是mongo文档
array(5) {
["_id"]=>
object(MongoId)#22 (1) {
["$id"]=>"4d7eaa848baf84d32b000000"
}
["activated"]=> (true)
["email"]=> "john@smith.com"
["name"]=> "john"
["password"]=> "334c4a4c42fdb79d7ebc3e73b517e6f8"
}
Run Code Online (Sandbox Code Playgroud)
如何在同一文档中找到可以同时找到电子邮件和密码的"WHERE"查询?我显然没有得到find()和findOne()查询的参数.PHP中的正确语法是什么?
我使用PHP数组语法遇到了这个MongoDB查询的问题.这是我想要使用的查询的直接版本.
db.collection.find({
$or: [
{$and : [{X:1}, {X: {$gt: 100}}]},
{$and : [{X:2}, {X: {$lt: 100}}]}
]
});
Run Code Online (Sandbox Code Playgroud)
注意:真正的查询更复杂,这只是一个例子.
我无法在PHP中找到一些描述此类查询的示例.我提出的最好的是:
$query = array(
'$or' => array(
array(
'$and' => array(
array('X' => 1),
array('X' => array('gt' => 100))
)
),
array(
'$and' => array(
array('X' => 2),
array('X' => array('lt' => 100))
)
),
)
);
$this->db->collection->find($query);
Run Code Online (Sandbox Code Playgroud)
但是这个查询不会返回任何结果.显然我们无法$and从数组中删除,因为我们不能在PHP数组中有重复的键.
我不想使用JavaScript表达式,因为速度至关重要.
更新:正如Alexander Azarov在评论中指出的那样,我的原始查询可以用不同的方式编写.我已使用正确使用的$and查询更新了问题 .
我希望在已存在的情况下替换文档,如果不存在,我希望将其插入.我怎么能在mongoDb中做到这一点?
我需要这样的东西,但在一个查询中:
find by a "where statement"
if exists, replace whole document
else, insert
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在计划和研究我从MySQL到MongoDB的转换,我只是有一个有趣的想法...我有一堆分层对象,我需要存储在数据库中.我目前的方法是在集合中包含一堆嵌入式文档.他们永远不需要被搜索.将序列化PHP对象,将它们粘贴在数据库中,然后在我想使用它们时将它们反序列化为PHP对象是否有意义?另一种方法是使用Doctrine作为我的ORM.
我的编程直觉告诉我这是一个糟糕的设计并且是有限的,但我觉得序列化和反序列化将非常快并且消除了对ORM的需求.
你怎么看?好的设计还是糟糕的设计?
我正在开发一个PHP应用程序,我们需要在某个边界内检索结果,但是按结果的创建日期排序,而不是距离.我认为MongoDB的geoNear命令对此很有用,因为它负责计算每个结果的距离.但是,我想知道是否有一种方法可以通过create_date属性指定排序,而不是距离.理想情况下,我会创建坐标的复合键索引并创建日期,然后快速检索由创建日期排序的特定区域中的所有结果.
这可能,或者我必须在查询后进行排序吗?
如何将机器ID /主机名映射/解映射到对象ID中的3个字节?
我应该在哪里寻找Linux中的机器ID?
domU-12-31-39-13-02-56看起来很奇怪,我不确定它是否正确?
<?php
$id = new MongoId('4f7351390c211d0a3d000004');
print_r($id->getHostname());
//domU-12-31-39-13-02-56
?>
Run Code Online (Sandbox Code Playgroud) 我从事多租户网络应用程序.有必要清楚一些用户容器,它们可能相当大,收集了许多文档.我需要能够删除许多类似的文档:
return self::remove(array('LISTID' => $listId), array('safe' => true));
Run Code Online (Sandbox Code Playgroud)
在某些情况下,可能有许多文档符合此标准,例如数千甚至数百万.我担心这个操作可能需要很长时间并节省服务器.如果有很多文档,是否值得将这样的操作排队等离线删除它们像伪代码:
while (there are documents) {
delete(1000 documents);
sleep();
}
Run Code Online (Sandbox Code Playgroud)
我想知道在这种情况下如何通过mongodb中较小的portios删除数据.我还注意到由于某些原因在mongodb中删除相当多的行发生得相当快,我们有在mongodb中存储数据的原型,在mysql中删除相似数量的行需要更长的时间,但在mysql中,表中的每一行都引用了其他表有了数据,但即使没有依赖表中的记录,在mongodb中看起来要快得多,在mongodb中它将所有数据存储在文档中,但无论如何我觉得相当奇怪.或者它可能是多余的?
谢谢.
什么是PHP语法将执行以下mongodb Shell的工作?
> db.SoManySins.find({},{"_id":0,"FactoryCapacity":1})
Run Code Online (Sandbox Code Playgroud) 我在ubuntu服务器上运行mongodb.服务器时间是
root# date
Thu Sep 13 21:15:58 BST 2012
Run Code Online (Sandbox Code Playgroud)
但是当我运行以下命令时,我得到了不同的结果
root# mongo
MongoDB shell version: 2.2.0
connecting to: test
> new Date()
ISODate("2012-09-13T20:15:58.670Z")
Run Code Online (Sandbox Code Playgroud)
只有一个小时的差异.当我updated_on使用php 更新文档字段时MongoDate(),该字段的值仍然是1小时关闭.
[编辑]其实我刚检查了我的php错误日志,日志文件中的时间也是1小时
[13-Sep-2012 20:11:14 UTC] Log Message (Time should be 21:11:14)
Run Code Online (Sandbox Code Playgroud) 我正在尝试find使用MongoRegex对MongoDB集合执行PHP ,但我无法使其工作.代码很简单:
$cursor = $this->collection->find($params)
//$params has this value:
//Array
//(
// [name] => MongoRegex Object
// (
// [regex] => .*victor.*
// [flags] => i
// )
// [login] => MongoRegex Object
// (
// [regex] => .*victor.*
// [flags] => i
// )
//)
Run Code Online (Sandbox Code Playgroud)
这个$params数组是用这个函数构造的:
function toRegEx($entryVars=array()){
$regexVars = array();
foreach($entryVars as $var => $value){
$regexVal = html_entity_decode($value);
$regexVars[$var] = new MongoRegex("/.*".$regexVal.".*/i");
}
return $regexVars;
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,此查询仅返回完全匹配的值(即登录名或名称正好为"胜利者"的文档).我想要的是查询返回登录名和/或名称包含单词"victor"的所有文档.我很确定我遗漏了一些基本的东西,但我无法找到它.任何帮助表示赞赏.谢谢!
mongodb ×10
mongodb-php ×10
php ×5
doctrine-orm ×1
geospatial ×1
indexing ×1
nosql ×1
orm ×1
regex ×1
sorting ×1