仅返回嵌入文档列表中的某些字段
Only return some of the fields from list of embedded documents
这是我的文档:
{
"_id" : "2",
"account" : "1234",
"positions" : {
"APPL" : { "quantity" : "13", "direction" : "long" },
"GOOG" : { "quantity" : "24", "direction" : "long" }
}
}
我想得到整个位置对象,但只有数量字段和忽略方向字段。有可能做到吗?或者我应该考虑其他模式(对象数组):
{
"_id" : "2",
"account" : "1234",
"positions" : [
{ "name" : "APPL", "quantity" : "13", "direction" : "long" },
{ "name" : "GOOG", "quantity" : "24", "direction" : "long" }
]
}
非常感谢!
对于"array"表单,您真正需要做的就是使用"点表示法"为数组成员指定字段:
db.collection.find({}, { "positions.quantity": 1, })
哪个会返回:
{
"_id" : "2",
"positions" : [
{ "quantity" : "13" },
{ "quantity" : "24" }
]
}
或者对于多个字段,但不包括"direction"
,只在投影中使用两者:
db.collection.find({},{ "positions.name": 1, "positions.quantity": 1 })
它仍然返回命名字段:
{
"_id" : "2",
"positions" : [
{
"name" : "APPL",
"quantity" : "13"
},
{
"name" : "GOOG",
"quantity" : "24"
}
]
}
对于"命名密钥"表单,您需要指定每个路径:
db.collection.find({},{ "positions.APPL.quantity": 1, "positions.GOOG.quantity": 1 })
当然会返回:
{
"_id" : "2",
"positions" : {
"APPL" : {
"quantity" : "13"
},
"GOOG" : {
"quantity" : "24"
}
}
}
这种"肮脏"在基本上ALLMongoDB操作、查询或投影或其他方面都很普遍。当您使用"命名密钥"时,"数据库"除了要求您"命名路径"之外没有其他合理的选择。这样做当然不是一个实际的练习,因为集合中的文档之间的键名称可能不同。
只有从MongoDB的角度来看,遍历键才能真正在JavaScript评估中完成。由于JavaScript评估需要解释器从BSON启动数据并将其转换为可行的JavaScript格式的成本,更不用说评估编码表达式本身的实际成本,所以这不是一种理想的方法。
此外,从"查询"的角度来看,这种处理需要使用$where
来评估这样一个表达式,您只想在"positions"
数据的每个"键"下查找内容。这是一件"坏事",因为这样的表达式不可能使用"索引"来优化查询搜索。只有使用"直接命名路径",才能在这些条件下实际使用甚至"创建"索引。
从"投影"的角度来看,"命名键"的使用意味着通过类似的"遍历"概念,您实际上需要再次进行JavaScript处理。MongoDB可以使用JavaScript表达式"更改"输出文档的机制是使用mapReduce
,所以这也是"超级可怕的",在这种情况下,你只会使用这种"聚合方法"来处理文档:
db.collection.mapReduce(
function() {
var id = this._id;
delete this._id;
Object.keys(this.positions).forEach(function(el) {
delete el.direction;
});
emit(id,this);
},
function() {}, // reducer never gets called when all are unique
{ "out": { "inline": 1 } }
)
即使您这样做只是为了避免命名路径,mapReduce
的输出也不能是"游标"。因此,这将您限制为BSON文档的大小以响应或实际输出到"集合"。因此,这远远不是你所能做到的"实用"。
"为什么"使用具有"公共路径"的数组比"命名键"结构好得多,原因有很多,而这种结构也太宽泛了,无法在这里深入讨论。您应该接受的一件事是"命名键很糟糕,好吧!"并继续使用一致的对象命名,这实际上很有意义。
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 只有在HTML表单中选择了某个下拉列表时,才需要字段
- Qualtrics(Javascript)-矩阵表-用下拉列表替换文本输入字段
- 根据另一个字段选择获取新值后更新下拉列表内容
- 如何在Sencha Touch应用程序的选择字段内自定义列表
- 如何检测从数据列表中选择时更改的输入字段
- 仅返回嵌入文档列表中的某些字段
- jQuery ui自动完成下拉列表中的两个字段
- 使用基于值的jQuery代码更改SharePoint列表字段颜色
- 提交带有已使用jQuery移动的列表框项目的隐藏字段
- 如何使用 couchdb 列表函数从 couchdb 视图结果中获取特定字段
- 从动态生成的输入字段中获取下拉列表中的数据,而无需保存值 - jquery
- 下拉列表自动填充到页面上的文本(非输入字段)中
- 在下拉列表中选择后,tr 中的输入字段不显示
- 获取剑道网格中已修改字段的列表
- 如何使用jQuery从数据列表中查找隐藏字段值
- AngularJS单击以编辑下拉列表等字段
- 是否有phonegap联系人的允许字段列表.find
- 在选择字段后从JSON中选择选项填充字段列表?Php, js, html
- 将网格绑定到表单:条件显示字段列表