MongoDB:用两个查询查询多个集合?

3
我有两个集合,一个是“posts”,另一个是“authors”。一个“post”文档包含了除了文章数据之外的一个指向作者“_id”的“DBref链接”ID。我的集合看起来像这样: posts
  "_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"]
}  

我的作者集合看起来像这样:

作者


{
  "_id" : ObjectId("4fa1242bd3269e9807000016"),
  "name" : "Kristina Chung ",
  "email" : "curran_ramos@google.co.id\r\n.dk",
  "age" : 60,
  "city" : "Copenhagen"
}

我试图创建一个“关联”查询来查找:评分大于6且小于9的帖子,其中帖子作者年龄大于19且小于25。
我试图进行聚合,但似乎无法获得正确的数据。
第一个查询在我的帖子集合中,看起来像这样:
$query = array('rating' => array('$gte' => 6, '$lt' => 9), 'comments.upVotes' => array('$gt' => 2, '$lt' => 20));

我选择 $id 字段,该字段是指向作者集合的引用。
然后我将所有 $id 放入一个数组中,如下所示:
while ($cursor->hasNext()): $document = $cursor->getNext();
    $authorID[] = $document['_id'];
endwhile;

然后我尝试使用这个查询在作者集合中找到正确的编号。

$query2 = array('age' => array('$gte' => 19, '$lt' =>100), '_id' => array('$in' => $authorID));
$cursor = q('author')->find($query2);

我试着使用以下代码来获取总数: $count = $cursor->count(); 但是无论我尝试运行什么查询,我总是得到0的结果。
我做错了什么?是否有可能创建这种类型的查询,还是必须在应用程序级别而不是数据库级别上进行?
我很清楚嵌入式文档,但我想要这两个集合分开而不是嵌入它。
希望有人能帮助我。
真诚地, - Mestika
2个回答

5
尝试在MongoDB中“创建一个“关系型”查询”将会非常令人沮丧。你的模式将某些信息(帖子的评分)存储在一个集合中,而将其他信息(作者的年龄)存储在另一个集合中,但是所有MongoDB查询都在单个集合上操作。除非您对数据进行反规范化(您表示您不想这样做),否则您需要使用两步方法来使其工作。
一种可行的方法是构建一个作者ID数组,并在使用“$in”查询帖子集合时使用它。以下是使用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}});

第一行创建一个空数组。第二行创建一个游标,选择目标年龄范围内所有作者的_id字段。第三行使用游标填充一个作者_id数组。第四行显示符合目标条件的所有帖子:作者_id在我们刚刚构建的列表中,评分在您指定的范围内。

1
我不确定,但有时候光标方法似乎会丢失一些元素,所以我更喜欢使用toArray()方法:
u = db.authors.find({"isActive":false}).toArray()
idlist = []
u.forEach(function(myDoc) { idlist.push(myDoc.ID ); } )
db.posts.find({"AuthorID": {$in : idlist} } )


u = db.authors.find({"isActive":false})
idlist2 = []
while (u.hasNext()) {idlist2.push(u.next()["ID"])};
idlist.forEach(function(myDoc) { 
   if ( idlist2.indexOf(myDoc) == -1 ) 
       {print (myDoc)} 
})

打印20个元素的!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接