Mes*_*ika 3 php collections json mongodb mongodb-query
我有两个收藏帖和作者.在帖子数据旁边,帖子文档包含作者_id的DBref链接 ID .我的收藏看起来像这样:
帖子
"_id" : ObjectId("4fa12443d3269e98070013b4"),
"author" : {
"$ref" : "authors",
"$id" : ObjectId("4fa1242bd3269e9807000023")
},
"post" : " mi eleifend egestas. Sed pharetra, felis eget varius ultrices, mauris ipsum porta elit, a feugiat tellus lorem eu metus. In lorem.",
"post_title" : "Volutpat. Nulla facilisis. Suspendisse commodo tincidunt nibh. Phasellus nulla. Integer",
"date" : 1293803276,
"rating" : 8,
"comments" : [{
"name" : "Doris Turner",
"email" : "Hedda_Herman@.com",
"upVotes" : 81,
"downVotes" : 93,
"comment_date" : 1111395830,
"comment" : "consectetuer ipsum nunc id enim. Curabitur massa. Vestibulum accumsan neque et nunc. Quisque ornare tortor at"
}, {
"name" : "Brenda Tyler",
"upVotes" : 1,
"downVotes" : 73,
"comment_date" : 940325674,
"comment" : "cursus purus. Nullam scelerisque neque sed sem egestas blandit. Nam Nulla aliquet. Proin velit. Sed malesuada augue ut lacus. Nulla tincidunt, neque vitae semper egestas, urna justo faucibus lectus, a sollicitudin orci sem eget massa."}],
"tags" : ["tag1", "tag3"]
}
Run Code Online (Sandbox Code Playgroud)
我的作者集合看起来像这样:
作者
{
"_id" : ObjectId("4fa1242bd3269e9807000016"),
"name" : "Kristina Chung ",
"email" : "curran_ramos@google.co.id\r\n.dk",
"age" : 60,
"city" : "Copenhagen"
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个"关系"查询来查找:评级大于6且小于9且帖子作者年龄大于19且小于25的帖子.
我试图聚合这个但似乎无法获得正确的数据.
第一个查询在我的帖子集合中,如下所示:
$query = array('rating' => array('$gte' => 6, '$lt' => 9), 'comments.upVotes' => array('$gt' => 2, '$lt' => 20));
Run Code Online (Sandbox Code Playgroud)
我选择了作者.$ id字段,它是作者集合的引用.
然后我将所有$ id放在一个数组中:
while ($cursor->hasNext()): $document = $cursor->getNext();
$authorID[] = $document['_id'];
endwhile;
Run Code Online (Sandbox Code Playgroud)
然后我尝试在authors集合中使用此查询找到正确的数字
$query2 = array('age' => array('$gte' => 19, '$lt' =>100), '_id' => array('$in' => $authorID));
$cursor = q('author')->find($query2);
Run Code Online (Sandbox Code Playgroud)
我试着用这段代码得到总数:$ count = $ cursor-> count(); 但无论我尝试运行什么查询,我总是得到结果0.
我做错了什么,可以创建这种查询,还是必须在应用程序级别而不是数据库级别上进行?
而且我很清楚嵌入式文档,但我希望将这两个集合分开并且不嵌入它.
希望任何人都可以帮助我.
真诚
- 梅斯蒂卡
尝试在MongoDB中"创建"关系"查询"将是一种令人沮丧的练习.您的模式将一些信息(帖子的评级)存储在一个集合中,将其他信息(作者的年龄)存储在不同的集合中,但所有MongoDB查询都在单个集合上运行.除非你对数据进行非规范化(你说你不想这样做),否则你需要一个两遍方法才能使这项工作成功.
应该工作的方法是构建一个作者ID数组,并使用'$ in'在posts集合的查询中使用它.以下是使用mongo shell在JavaScript中的样子:
> var authorList = [];
> var authorCursor = db.authors.find({age:{$gt:19,$lt:25}},{"_id":1});
> while(authorCursor.hasNext()){authorList.push(authorCursor.next()["_id"])};
> db.posts.find({"author.$id":{$in:authorList},rating:{$gt:6,$lt:9}});
Run Code Online (Sandbox Code Playgroud)
第一行创建一个空数组.第二行创建一个光标,用于选择_id目标年龄范围内所有作者的字段.第三行使用光标填充作者_id的数组.第四行显示符合您的目标条件的所有帖子:_id我们刚刚构建的列表中的作者,并在您指定的范围内进行评级.
| 归档时间: |
|
| 查看次数: |
3625 次 |
| 最近记录: |