2014-02-05 26 views
3

考虑下面的帖子集合:

{ 
    _id: 1, 
    title: "Title1", 
    category: "Category1", 
    comments: [ 
       { 
        title: "CommentTitle1", 
        likes: 3 
       }, 
       { 
        title: "CommentTitle2", 
        likes: 4 
       } 

      ] 
} 
{ 
    _id: 2, 
    title: "Title2", 
    category: "Category2", 
    comments: [ 
       { 
        title: "CommentTitle3", 
        likes: 1 
       }, 
       { 
        title: "CommentTitle4", 
        likes: 4 
       } 

      ] 

} 
{ 
    _id: 3, 
    title: "Title3", 
    category: "Category2", 
    comments: [ 
       { 
        title: "CommentTitle5", 
        likes: 1 
       }, 
       { 
        title: "CommentTitle6", 
        likes: 3 
       } 
     ] 
    } 

我想检索所有的职位,如果一个职位有4个喜欢评论我想只有在“意见”数组来检索此评论。如果我这样做:

db.posts.find({}, {comments: { $elemMatch: {likes: 4}}}) 

...我得到这个(这是我想要什么):

{ 
    _id: 1, 
    comments: [ 
     { 
      title: "CommentTitle2", 
      likes: 4 
     } 
    ] 
} 
{ 
    _id: 2, 
    comments: [ 
     { 
      title: "CommentTitle4", 
      likes: 4 
     } 
    ] 
} 
{ 
    _id: 3 
} 

但我怎么能检索文档的其余字段,而不必每次申报他们像下面?如果这样,增加了更多的领域后的文件,我也不会改变查找查询

db.posts.find({}, {title: 1, category: 1, comments: { $elemMatch: {likes: 4}}}) 

感谢

回答

1

- 编辑 -

对不起,你的问题的误读。我想你会在这里找到我对这个问题的回应,就是你正在寻找的东西。由于人评论,你无法预测这办法在找,但是你可以使用聚合这样做:

https://stackoverflow.com/a/21687032/2313887

答案的其余部分代表一样有用。所以我想我会把它留在这里

当你使用投影时,你必须全部指定你想要的或者没有任何东西。

你在这里问的基本上是,一旦你选择改变文件的输出和限制如何显示一个字段,那么我可以避免指定行为。底线是思考一个查询参数的投影部分,就像SQL SELECT。它的行为在于*或全部是默认值,之后是一个字段列表,也可能是字段格式的一些操作。唯一的区别是_id这是永远存在默认情况下,除非将其排除,即{_id:0}指定,否则

或者,如果你想过滤收集你的东东把你的$elemMatchquery本身。这里在投影中的用法是明确限制返回的文档只包含数组中的匹配元素。

改变您的查询:

db.posts.find(
    { comments: { $elemMatch: {likes: 4}}}, 
    { title: 1, category: 1, "comments.likes.$": 1 } 
) 

而且得到你想要的,我们使用的位置$运营商在查找的突出部分的内容。

查看文档中的两种用法的区别:

http://docs.mongodb.org/manual/reference/operator/query/elemMatch/

http://docs.mongodb.org/manual/reference/operator/projection/elemMatch/

+0

嗨尼尔。感谢您的回答。我认为我的解释不清楚。我想检索所有帖子,以及那些有4个评论的评论,我只想在comment数组下面检索该评论。所以我认为这个预测是必要的。 – rasco22862

+0

@ rasco22862清除声明正是你想要的。 –

+0

再次感谢。有没有办法做到这一点没有明确设置每个领域(标题:1,类别:1等)?因此,如果我向帖子文档添加了另一个字段,我不必修改查询。 – rasco22862

相关问题