Javascript 如何限制从添加到Mongo视图的$lookup操作返回的字段
在我的MongoDB/Node后端设置中,我通过Studio 3T使用管道操作符的组合来创建特定视图。该管道中的一个步骤涉及使用Javascript 如何限制从添加到Mongo视图的$lookup操作返回的字段,javascript,node.js,mongodb,aggregation-framework,lookup,Javascript,Node.js,Mongodb,Aggregation Framework,Lookup,在我的MongoDB/Node后端设置中,我通过Studio 3T使用管道操作符的组合来创建特定视图。该管道中的一个步骤涉及使用$lookup操作符从第二个集合中提取相关数据。此代码如下所示: // Stage 3 { $lookup: { "from": "clients", "localField": "client.id", "foreignField": "_id", "as": "client" } } client: { _id: s
$lookup
操作符从第二个集合中提取相关数据。此代码如下所示:
// Stage 3
{
$lookup: {
"from": "clients",
"localField": "client.id",
"foreignField": "_id",
"as": "client"
}
}
client: {
_id: someId,
prop1: value,
prop2: value,
prop3: value,
name: {
first: value,
last: value
}
prop4: value
}
var pipeline = [
/* ... */
{
$lookup: {
"from": "clients",
"localField": "client.id",
"foreignField": "_id",
"as": "client"
}
},
/* ... */
{
$project: {
client: {
_id: 1,
name: 1
}
}
}
];
要将此下拉列表作为对象而不是数组放入视图中,我将使用$unwind
操作符,如下所示:
// Stage 4
{
$unwind: {
path : "$client"
}
}
现在,它可以工作了,因为来自另一个集合的相应记录中的信息正好放在视图中我想要的位置。然而,问题是,这会从相应的记录中提取所有字段,而我实际需要的只是来自该对象的三个项;即\u id
和name.first
和name.last
现在我得到的是这样的东西:
// Stage 3
{
$lookup: {
"from": "clients",
"localField": "client.id",
"foreignField": "_id",
"as": "client"
}
}
client: {
_id: someId,
prop1: value,
prop2: value,
prop3: value,
name: {
first: value,
last: value
}
prop4: value
}
var pipeline = [
/* ... */
{
$lookup: {
"from": "clients",
"localField": "client.id",
"foreignField": "_id",
"as": "client"
}
},
/* ... */
{
$project: {
client: {
_id: 1,
name: 1
}
}
}
];
当我需要的只是这个:
client: {
_id: someId,
name: {
first: value,
last: value
}
}
我浏览了mongo文档,但不清楚如何限制从$lookup操作打印到视图的数据量。我是否需要向$lookup操作添加一些条件逻辑?或者,我是否应该在管道上添加其他操作员来处理此问题?对输出文档进行“重塑”听起来很像管道的使用阶段
在这种情况下,只需添加一个后阶段,它就应该适合目的。这是一条显而易见的道路。
大概是这样的:
// Stage 3
{
$lookup: {
"from": "clients",
"localField": "client.id",
"foreignField": "_id",
"as": "client"
}
}
client: {
_id: someId,
prop1: value,
prop2: value,
prop3: value,
name: {
first: value,
last: value
}
prop4: value
}
var pipeline = [
/* ... */
{
$lookup: {
"from": "clients",
"localField": "client.id",
"foreignField": "_id",
"as": "client"
}
},
/* ... */
{
$project: {
client: {
_id: 1,
name: 1
}
}
}
];
在$lookup阶段之后使用$project怎么样?好的,明白了!使用$project确实有效。谢谢,费利普斯马丁斯。如果你想写一个答案,我会把它标为正确的。如果没有,我稍后会写下我的完整答案。