【问题标题】:Meteor/MongoDB - How to get single elements from an object array and display them in a table?Meteor/MongoDB - 如何从对象数组中获取单个元素并将它们显示在表格中?
【发布时间】:2017-12-31 10:49:08
【问题描述】:

我是 MongoDB 新手,想使用 Meteor 模板在表格中显示查询到的数据。

我有一个名为“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”以及“用户名”和“用途”。 “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”的文档数组中的所有字段和对象不仅是“itemId”字段的数据“item_2”。获取查询的所有字段“itemId”、“用户名”和“目的”(仅包含 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”的所有数据并将其显示在表格中。如果有任何帮助,我将不胜感激。

【问题讨论】:

    标签: arrays mongodb templates meteor mongodb-query


    【解决方案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 应该。

    【讨论】:

    • 非常感谢,我认为它至少在某种程度上可以工作,直到它显示表格中的数据。您的第一个和第二个解决方案返回了一些东西。现在我可以在表格中看到[object Object],但仍然不是实际值。我需要重写模板还是必须以某种方式更改检索到的数据的类型?
    • 编辑:我将模板更改为 {{ itemInfosDisplay }} 没有任何 {{#each}},因为只有在这种情况下才会返回 [object Object]。在原始模板中,表格中没有显示任何内容。
    • 只需删除 {{#each myItems}}。所以你的模板应该是: {{#each itemInfosDisplay}} {{itemId}} {{/each}} 请记住,使用新助手直接返回 myItems 数组,即 [{itemId: XXX, username: XXX, purpose :XXX},{itemId:YYY,用户名:YYY,目的:YYY}]。返回的数组中没有 myItems 属性。如果您想查看返回的确切数据结构,您可以使用 console.log(items),然后您可以根据它制作您的 blaze 模板。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    相关资源
    最近更新 更多