MongoDB从数组返回特定​​字段

时间:2014-11-17 16:14:16

标签: javascript mongodb meteor

我想将查询的结果限制为一组字段。这是我的一份文件:

{
    "_id" : "WA9QRuiWtGsr4amtT",
    "status" : 3,
    "data" : [ 
        {
            "name" : "0",
            "value" : "Text ..."
        }, 
        {
            "name" : "1",
            "value" : "12345678"
        }, 
        {
            "name" : "2",
            "value" : "Text"
        }, 
        {
            "name" : "4",
            "value" : "2"
        }, 
        {
            "name" : "8",
            "value" : true
        }, 
        {
            "name" : "26",
            "value" : true
        },
    ],
    "userId" : "7ouEumtudgC2HX4fF",
    "updatedAt" : NumberLong(1415903962863)
}

我想将输出限制为状态字段以及第一个和第三个数据文档。

这就是我的尝试:

Meteor.publish('cases', function () {

  var fields = {
    currentStatus: 1,
    'data.0': 1,
    'data.2': 1
  };

  return Cases.find({}, { fields: fields });
});

可悲的是,它不起作用。我找到的其他东西是$ elemMatch,但它只返回第一个元素:

data: { 
  $elemMatch: { 
    name: { 
      $in: ['0', '2']
    }
  }
},

如何限制输出到这些字段?

1 个答案:

答案 0 :(得分:0)

要显示状态和数据(无限制)字段,请尝试

cases.find({}, {"status":1, "data":1})

这是一个简单的查询,以限制"数据"输出你需要更加努力:)

通过data.name获取1个元素(不是按位置):

cases.find({}, {status:1, "data": {$elemMatch:{name:"0"}}})

通过data.name获取1个元素,但是从值列表中获取:

cases.find({}, {status:1, "data": {$elemMatch:{name:{$in:["0", "1"]}}}})

要接近您的问题,您可以尝试redact。这是Mongodb 2.6中的新功能。 或者在以前的版本中使用$ unwind和.aggregate()。

到目前为止,我没有看到基于位置返回数组元素的方法。