1
{
   "name": "comments",
   "rid": 456,

   "refs": [
     {
       "no": 1,
       "info": "this is first"  
    },
     {
       "no": 2,
       "info": "this is second" 
    },
     {
       "no": 3,
       "info": "this is third"  
    } 
  ] 
}
{
   "name": "comments",
   "rid": 321,

   "refs": [
     {
       "no": 1,
       "info": "this is first-h"  
    },
     {
       "no": 2,
       "info": "this is second-h" 
    },
     {
       "no": 3,
       "info": "this is third-h"  
    } 
  ] 
}

假设我有一个像上面这样的文档结构。我需要得到 rid 为 456 而 no 为 2 的数组。所以,我只想得到数组

     {
       "no": 2,
       "info": "this is second" 
    }

我怎么能那样做?

4

2 回答 2

3

除了 JohnnyHK 使用位置运算符之外,在 MongoDB 2.2+ 中还有更多方法可以解决此问题:

方法#1:使用$elemMatch投影

$elemMatch投影可用于包含数组的单个匹配元素。默认情况下,结果还包括 document _id,但如果不需要,您可以将其排除:

db.comments.find(
    { rid: 456 },
    { _id:0, refs: { $elemMatch: { no: 2 } }}
)

示例输出:

{ "refs" : [ { "no" : 2, "info" : "this is second" } ] }

方法#2:使用聚合框架

聚合框架包括$unwind数组和$match文档标准的运算符。这种方法比使用$elemMatch投影更灵活,因为现在可以返回每个数组的多个匹配项。

db.comments.aggregate(

    // Find matching documents of interest (can use an index)
    { $match: { rid: 456 }},

    // Create stream of documents based on the `refs` array
    { $unwind: "$refs" },

    // Match the specific refs element(s) of interest
    { $match: { "refs.no" : 2 }},

    // Project the desired output
    { $project: {
        _id: 0,
        no: "$refs.no",
        info: "$refs.info"
    }}
)

示例输出:

{
    "result" : [
        {
            "no" : 2,
            "info" : "this is second"
        }
    ],
    "ok" : 1
}
于 2013-01-06T04:31:10.617 回答
1

您可以使用点表示法来查找所需的文档,并使用$位置运算符在结果中仅包含匹配的数组元素:

 db.test.find({rid: 456, 'refs.no': 2}, {_id: 0, 'refs.$': 1})

返回:

{ "refs": [ { "no": 2, "info": "this is second" } ] }
于 2013-01-06T04:22:50.830 回答