0

我有一个用户集合,其架构如下:

var userSchema = new mongoose.Schema({
  id : Number,
  tags                  : 
    [
      {
        tag_name : String,
        tag_url  : String, 
        posts    : 
          [
            {
                post_id: String
            }
          ]
      }                  
    ]
});

我想做的是只检索 post_id 值在帖子数组中的 tag_name 。所以,我尝试查询如下

db.users.find({'tags.posts.post_id':'000000'}, {'tags.tag_name':1})

不幸的是,尽管 post_id 不在帖子数组中,但我得到了所有 tag_name。

你能帮我写这个查询吗?

编辑================================================== =================

假设我有如下数据:

tags
[
  { 
    tag_name: 'java',
    posts   : [{post_id:'000000'}, {post_id:'111111'}
  },
  { 
    tag_name: 'ruby',
    posts   : [{post_id:'000000'}, {post_id:'111111'}
  },
  { 
    tag_name: 'php',
    posts   : [{post_id:'111111'}
  },
]

我想通过 post_id 获得标签元素,如果我按 post_id 搜索是 '000000' 我只想获得 tag_name 是 'java' 和 'ruby' 而不是最后一个标签元素的标签元素,这可能吗?

4

1 回答 1

1

$应该有tags.$.tag_name帮助:

db.users.find({'tags.posts.post_id':'000000'}, {'tags.$.tag_name':1})

编辑: 好的,我读了你的更新。在这种情况下,我在聚合框架中看到了一个解决方案。我们可以尝试像这样构建管道:

db.col.aggregate(
    {$match: {'tags.posts.post_id':'000000'}}, 
    {$unwind: '$tags'}, 
    {$match: {'tags.posts.post_id':'000000'}}, 
    {$group: {_id:'$_id', tags: {$push: '$tags'}}}
)

结果将是:

{
        "_id" : ObjectId("5209f5e4ef21a864f6f6ed54"),
        "tags" : [
            {
                "tag_name" : "java",
                "posts" : [
                    { "post_id" : "000000" },
                    { "post_id" : "111111" }
                ]
            },
            {
                "tag_name" : "ruby",
                "posts" : [
                    { "post_id" : "000000" },
                    { "post_id" : "111111" }
                ]
            }
        ]
}

如您所见,我做了$match两次。这是出于性能目的。通过第一次匹配,我们减少了集合中包含的文档post_id:000000集。第二个匹配过滤器tags

于 2013-08-13T06:23:21.353 回答