我是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”的所有数据并将其显示在表格中。我会很感激有用的任何内容。
答案 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应该。