gpt4 book ai didi

javascript - 仅返回嵌入文档列表中的部分字段

转载 作者:行者123 更新时间:2023-11-27 23:09:10 27 4
gpt4 key购买 nike

这是我的文档:

{
"_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" }
]
}

非常感谢!

最佳答案

对于“数组”形式,您真正需要做的就是使用"dot notation"指定字段。到数组成员:

db.collection.find({}, { "positions.quantity": 1, })

这将返回:

{
"_id" : "2",
"positions" : [
{ "quantity" : "13" },
{ "quantity" : "24" }
]
}

或者对于多个字段但不包括“方向”,只需在投影中使用两者:

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"
}
}
}

这种“肮脏”现象在所有 MongoDB 操作、查询、投影或其他操作中普遍存在。当您使用“命名键”时,“数据库”除了要求您“命名路径”之外没有其他合理的选项。当集合中的文档之间的键名称可能不同时,这样做当然不是真正的实际练习。

从 MongoDB 的 Angular 来看,遍历键只能在 JavaScript 评估中真正完成。由于 JavaScript 评估需要解释器成本来启动数据并将其从 BSON 转换为可用的 JavaScript 格式,更不用说评估编码表达式本身的实际成本,因此这不是一种理想的方法。

此外,从“查询”的 Angular 来看,此类处理需要使用 $where评估这样一个表达式,您只想在 "positions" 数据的每个“key”下查找内容。这是一件“坏”事情,因为这样的表达式不可能使用“索引”来优化查询搜索。只有使用“直接命名路径”,您才能在这些条件下实际使用甚至“创建”索引。

从“投影”的 Angular 来看,“命名键”的使用意味着通过类似的“遍历”概念,您实际上需要再次进行 JavaScript 处理才能做到这一点。 MongoDB 可以使用 JavaScript 表达式“更改”输出文档的唯一机制是使用 mapReduce所以这又是“ super 可怕”,在这种情况下,您将使用这种“聚合方法”只不过是进行文档操作:

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 文档的大小实际输出到“集合”。所以这离“实用”还很远。

<小时/>

“为什么”使用具有“公共(public)路径”的数组比“命名键”结构好得多,有很多原因,这些结构也太宽泛,无法在此讨论。您应该接受的一件事是“命名键不好,好吧!”并继续使用一致的对象命名,这实际上很有意义。

关于javascript - 仅返回嵌入文档列表中的部分字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36326725/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com