gpt4 book ai didi

javascript - 从内部数组中选择第一个元素

转载 作者:行者123 更新时间:2023-12-03 03:58:55 24 4
gpt4 key购买 nike

我想从嵌套数组中选择第一项,而不获取整个文档。

架构/模型

假设我有一个像这样的架构:

const parentSchema = mongoose.Schema({
name: String,
children: []
});

const grandparentSchema = mongoose.Schema({
name: String,
children: [parentSchema]
})

这将转换为这个示例实例:

{
name: 'Grandparent Foo',
children: [
{
name: 'Parent Foo',
children: ['Child Foo', 'Child Bar', 'Child Baz']
}
]
}

问题

我想要 'Parent Foo' 的第一个 child ,所以归根结底我应该回来 'Child Foo '

注释

  • 如你所见,孙子们很朴素String s,不是Document s 本身(与 Parent 相比),因此我无法使用点表示法选择它们。

  • 我不想返回整个文档并在代码中对其进行过滤。我只想通过网络传输第一个孙子,因为孙子数组(children'Parent Foo' 数组)可能包含数百万个条目。

  • 我需要这个,因为我想要$pop第一个孙子并返回它。为此,我计划先获取该项目,然后获取 $pop它关闭了,这就是为什么我问这个问题

最佳答案

如果不向数据库投入额外的工作,您确实无法做到这一点。

作为一般性解释:

Grandparent.find(
{ "children.name": "Parent Foo" },
{ "children.$": 1 }
)

将仅返回来自“children”的匹配条目,并且不存在其他条目。

如果您明确需要“第一个”数组元素,则可以使用 .aggregate():

Granparent.aggregate([
{ "$match": { "children.name": "Parent Foo" } },
{ "$addFields": {
"children": {
"$map": {
"input": {
"$filter": {
"input": "$children",
"as": "child",
"cond": { "$eq": [ "$$child.name", "Parent Foo" ] }
}
},
"as": "child",
"in": {
"name": "$$child.name",
"children": { "$arrayElemAt": [ "$$child.children", 0 ] }
}
}
}
}}
])

所以你基本上使用 $filter复制标准位置匹配,然后使用 $map reshape $arrayElemAt$slice实际获取内部数组的第一个元素。

相比之下,如果您接受返回“少量额外数据”,那么您只需切掉位置匹配即可:

Grandparent.find(
{ "children.name": "Parent Foo" },
{ "children.$": 1 }
).lean().exec((err,docs) => {
docs = docs.map( doc => {
doc.children = doc.children.map( c => c.children = c.children.slice(0,1) );
return doc;
});
// do something with docs

因此,我们在游标中返回了更多内容,并以最小的努力删除了这一点数据。

由于实际数据的实际大小,里程可能会有所不同,但如果差异“小”,那么通常最好在客户端而不是服务器中“trim ”。

关于javascript - 从内部数组中选择第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44818333/

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