Meteor / MongoDB - 如何从对象数组中获取单个元素并将其显示在表中?

时间:2017-07-25 13:15:09

标签: arrays mongodb templates meteor mongodb-query

我是MongoDB的新手,希望使用Meteor Templates在表格中显示查询数据。

我有一个名为“infoData”的集合,具有以下结构:

第一份文件:

{
    "_id" : "A-89273498720",
    "myItems" : [ 
        {
            "itemId" : "item_1",
            "username" : "Homer",
            "purpose" : "justBecause",
        }, 
        {
            "itemId" : "item_2",
            "username" : "March",
            "purpose" : "justBecause2",

        }, 
        {
            "itemId" : "item_3",
            "username" : "Maggie",
            "purpose" : "justBecause3",

        }
    ]
}

第二份文件:

{
    "_id" : "B-564548461117",
    "myItems" : [ 
        {
            "itemId" : "item_4",
            "username" : "Lisa",
            "purpose" : "justBecause4",

        }, 
        {
            "itemId" : "item_5",
            "username" : "Lisa",
            "purpose" : "justBecause5",

        }, 
        {
            "itemId" : "item_6",
            "username" : "Bart",
            "purpose" : "justBecause5",

        }
    ]
}

现在我需要使用“itemId”作为查询运算符来检索“itemId”以及“username”和“purpose”。 “itemId”是唯一的。我的第一个问题是获取数据。例如,我尝试使用单个“itemId”字段“item_2”:

infoData.findOne({"myItems.itemId": "item_2"}, {_id: 0, 'myItems.$': 1})

获得与

相同的结果
infoData.findOne(
    {
        'myItems.itemId': "item_2"
    }, 
    {
        '_id': 0, 'myItems': {$elemMatch: {'itemId': "item_2"}}
    })

我不确定这是否是我需要的结果,因为当我将此查询放在JSON.stringify()中以查看控制台中的数据时,我会看到包含“item_2”的doc数组中的所有字段和对象而不仅仅是“itemId”字段的数据“item_2”。获取查询的所有字段“itemId”,“username”和“purpose”(仅包含item_2的对象)以便稍后在表中迭代它的可能性对我来说也是有效的。

第二个问题是我需要在表格中显示数据。

所以我写了这个帮手:

'itemInfoDisplay': function() {
    if (Meteor.userId()) {
        var itemInfos= infoData.findOne(
            {"myItems.itemId": "item_2"}, {_id: 0, 'myItems.$': 1});
        return itemInfos
    }
}

并希望在表格中显示数据:

{{#each itemInfoDisplay}}
    {{#each myItems}}
        <tr>
            <td><h4>{{ itemId }}</h4></td>
        </tr>
    {{/each}}
{{/each}}

我知道代码和HTML模板都有问题。我猜mongoDB查询的结果不是数组?是否有可能成为一个?使用的mongo查询是否符合我的需求?

最后,我只需要获取分配给特定“itemId”的所有数据并将其显示在表格中。我会很感激有用的任何内容。

1 个答案:

答案 0 :(得分:1)

我可以想到两种方法来做到这一点。第一种是使用本文中提到的投影:Retrieve only the queried element in an object array in MongoDB collection

但是,您似乎正在使用该$ elemMatch格式。如果它不起作用,不确定是否要尝试find()而不是findOne()。 Meteor将查询发送到mongodb的方式可能有所不同。

如果这不起作用,第二种方式是一点点黑客但会起作用。我们利用了findOne(与find不同)在客户端上是同步的这一事实。所以我们可以获取记录,然后手动执行forEach只获取相应的数组元素并返回该数组。像这样:

var itemInfos= infoData.findOne({"myItems.itemId": "item_2"}, {_id: 0, 'myItems.$': 1});
var items = [];

itemInfos.myItems.forEach(function(myItem) {
  if (myItem.itemId == "item_2") {
    items.push(myItem);
  };
});

return items;

如果使用lodash,则可以跳过forEach循环并使用过滤器:

return( _.filter(itemInfos.myItems, {itemId: "item_2"}) );

理想的方法是在查询级别限制数据,但如果这不起作用,则选项2应该。