Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 过滤后的mongoDB项目数组元素_Javascript_Mongodb_Mongoose - Fatal编程技术网

Javascript 过滤后的mongoDB项目数组元素

Javascript 过滤后的mongoDB项目数组元素,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,我有以下(简化的)汇总: Model.aggregate([ { $lookup: { from: 'orders', localField: '_id', foreignField: 'customer', as: 'orders', }, }, { $project: { openOrders: { $filter: {

我有以下(简化的)汇总:

Model.aggregate([
    {
      $lookup: {
        from: 'orders',
        localField: '_id',
        foreignField: 'customer',
        as: 'orders',
      },
    },
    {
      $project: {
        openOrders: {
          $filter: {
            input: '$orders',
            as: 'order',
            cond: { $eq: ['$$order.status', 'open'] },
          },
        },
      },
    },        
  ])
返回以下内容:

{
  _id: ...,
  openOrders: [
    [Object], [Object]
  ],
}
那些
[Object]
只是返回的对象,保存在数据库中,包含所有字段

我没有找到一种方法来投影/过滤这些对象的字段,而是只返回它们的
\u id

{
  _id: ...,
  openOrders: [
    _id: ...,
    _id: ....
  ],
}
编辑:我更喜欢以下预期输出:

{
  _id: ...,
  openOrders: [
    { _id: ... },
    { _id: ... }
  ],
}

我尝试在聚合的各个点添加一个新的
$project
阶段,但没有成功。有人能帮我吗?

您应该添加一个
$project
阶段,如下所示:

{
$项目:{
openOrders:'openOrders.\u id'
}
}
这将产生如下输出:

{
  _id: ...,
  openOrders: [
    _id1,
    _id2,
    ...
  ],
}
而不是

{
  _id: ...,
  openOrders: [
    _id: ...,
    _id: ....
  ],
}
我建议使用这种类型的查询,因为如果您实际看到的是
openOrders
,它只是
\u id
s的数组,因此在数组中只添加一个
\u id
字段没有意义

如果仍希望输出类似于对象数组,则可以使用以下命令:

{
$项目:{
“openOrders.\u id”:1
}
}

您应该添加一个
$project
阶段,如下所示:

{
$项目:{
openOrders:'openOrders.\u id'
}
}
这将产生如下输出:

{
  _id: ...,
  openOrders: [
    _id1,
    _id2,
    ...
  ],
}
而不是

{
  _id: ...,
  openOrders: [
    _id: ...,
    _id: ....
  ],
}
我建议使用这种类型的查询,因为如果您实际看到的是
openOrders
,它只是
\u id
s的数组,因此在数组中只添加一个
\u id
字段没有意义

如果仍希望输出类似于对象数组,则可以使用以下命令:

{
$项目:{
“openOrders.\u id”:1
}
}

因为您需要一组
\u id
如下

openOrders: [ _id: ..., _id: .... ]
但不是对象中的
\u id
数组:

openOrders: [ {_id: ...}, {_id: ....} ]
您需要使用而不是
$filter

尝试下面的查询:

 db.collection.aggregate([
    {
      $project: {
        openOrders: {
          $reduce: {
            input: "$orders", // Same like `$filter` use reduce to iterate on array
            initialValue: [], // consider an initial value
            in: { // If condition is met, push value to array else return holding array as is.
              $cond: [ { $eq: [ "$$this.status", "open" ] },
                { $concatArrays: [ "$$value", [ "$$this._id" ] ] },
                "$$value"
              ]
            }
          }
        }
      }
    }
  ])
测试:

注意:在javaScript中-如果要打印带有对象的JSON,则需要使用
JSON.stringify(yourJSON)
-将其设置为字符串,这样您就不会在控制台中看到
[Object],[Object]
,而会看到实际的对象

更新:

 db.collection.aggregate([
    {
      $project: {
        openOrders: {
          $reduce: {
            input: "$orders", // Same like `$filter` use reduce to iterate on array
            initialValue: [], // consider an initial value
            in: { // If condition is met, push value to array else return holding array as is.
              $cond: [ { $eq: [ "$$this.status", "open" ] },
                { $concatArrays: [ "$$value", [ "$$this._id" ] ] },
                "$$value"
              ]
            }
          }
        }
      }
    }
  ])
如果您需要具有
\u id
字段的对象数组,只需在末尾添加另一个
$project
阶段,但我强烈建议使用
$reduce
并为您的场景获取数组:

{ $project: { "openOrders._id": 1 } } // which would just extract `_id` fields in each objects

测试:

因为您需要一个
\u id
数组,如下所示

openOrders: [ _id: ..., _id: .... ]
但不是对象中的
\u id
数组:

openOrders: [ {_id: ...}, {_id: ....} ]
您需要使用而不是
$filter

尝试下面的查询:

 db.collection.aggregate([
    {
      $project: {
        openOrders: {
          $reduce: {
            input: "$orders", // Same like `$filter` use reduce to iterate on array
            initialValue: [], // consider an initial value
            in: { // If condition is met, push value to array else return holding array as is.
              $cond: [ { $eq: [ "$$this.status", "open" ] },
                { $concatArrays: [ "$$value", [ "$$this._id" ] ] },
                "$$value"
              ]
            }
          }
        }
      }
    }
  ])
测试:

注意:在javaScript中-如果要打印带有对象的JSON,则需要使用
JSON.stringify(yourJSON)
-将其设置为字符串,这样您就不会在控制台中看到
[Object],[Object]
,而会看到实际的对象

更新:

 db.collection.aggregate([
    {
      $project: {
        openOrders: {
          $reduce: {
            input: "$orders", // Same like `$filter` use reduce to iterate on array
            initialValue: [], // consider an initial value
            in: { // If condition is met, push value to array else return holding array as is.
              $cond: [ { $eq: [ "$$this.status", "open" ] },
                { $concatArrays: [ "$$value", [ "$$this._id" ] ] },
                "$$value"
              ]
            }
          }
        }
      }
    }
  ])
如果您需要具有
\u id
字段的对象数组,只需在末尾添加另一个
$project
阶段,但我强烈建议使用
$reduce
并为您的场景获取数组:

{ $project: { "openOrders._id": 1 } } // which would just extract `_id` fields in each objects


测试:

在第一个$project之后?类似于:
{$project{…},{$project{'openOrders.\u id':1}}
?不,类似于
.aggregate([{$lookup:{…},{$project:{…},{$project{openOrders:'openOrders.\u id'}}])
。让我检查一下另一个答案。不过,谢谢你的时间。你能试着在Mongo shell中运行这个并检查一下吗?对不起,你的答案是正确的!我打印错误,但由于@whoami建议,我可以验证您答案的正确性。再次感谢!在第一个$project之后?类似于:
{$project{…},{$project{'openOrders.\u id':1}}
?不,类似于
.aggregate([{$lookup:{…},{$project:{…},{$project{openOrders:'openOrders.\u id'}}])
。让我检查一下另一个答案。不过,谢谢你的时间。你能试着在Mongo shell中运行这个并检查一下吗?对不起,你的答案是正确的!我打印错误,但由于@whoami建议,我可以验证您答案的正确性。再次感谢!实际上,我的问题中的预期输出示例并不严格,但也可以是一个对象数组,每个对象都包含一个
\u id
字段。我会修改我的问题,如果你也能修改你的答案以符合我的新要求,我将非常感激。非常感谢你的回答。有了关于打印对象方式的建议,我可以验证我问题的第一个答案是否正确,是否足以解决我的问题。我接受另一个答案只是为了时间的问题,不管怎样,你的答案提供了关于这个问题的有趣见解,从中我可以学到新的东西。谢谢你抽出时间。谢谢你!请问您为什么建议使用
$reduce
并获取
\u id
数组而不是对象数组?在处理返回的结果时可能是为了方便起见?@Kenna:是的,你从DB中获取数据并不是为了查看它:-)你肯定会在某个时候处理它,所以把它想象成你只需要
\u id
,你只是在数组中获取它们:
[\u id1,\u id2]
还是在数组的对象中获取它们
[{u id:1},{u-id:1}]
-我想说一组
\u-id
最适合大多数场景!但最终这一切都取决于你的要求!只要记住从数据库中获取正确的数据,就可以在代码方面帮助您很多..好的,我知道了。谢谢事实上,我问题中的预期产出的例子是否定的