Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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
Node.js MongoDB-mongoosefind命令,仅从嵌入对象获取值_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js MongoDB-mongoosefind命令,仅从嵌入对象获取值

Node.js MongoDB-mongoosefind命令,仅从嵌入对象获取值,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我的模式看起来像这样 { _id: '1', items: { 'id1': 'item1', 'id2': 'item2', 'id3': 'item3' } } 以下是查询 ItemModel.find({}, { items: 1, _id: 0 }); 查找查询的结果是: { "items" : { "21" : "item21", "22" : "i

我的模式看起来像这样

{
  _id: '1',
  items: {
    'id1': 'item1',
    'id2': 'item2',
    'id3': 'item3'
  }
}
以下是查询

ItemModel.find({}, {
  items: 1,
  _id: 0
});
查找查询的结果是:

{ "items" : { "21" : "item21", "22" : "item22", "23" : "item23" } }
{ "items" : { "31" : "item31", "32" : "item32", "33" : "item33" } }
{ "items" : { "11" : "item11", "12" : "item32", "13" : "item13" } }
我想要的是:

["item21", "item22", "item23",
 "item31", "item32", "item33",
 "item11", "item12", "item13"]
目前,我正在node.js端进行处理,以获取上述信息。我想减少来自MongoDB的输出负载大小。“items”键是冗余的,当我获取它时,也不需要提到的id。在这里,ID非常小,比如21、22、13等等,但它们的长度实际上是50个字符


如果不是上述情况,也欢迎任何其他有效的替代方案。

如何实现这一点的一个示例是以下汇总:

[
  {
    $project: {
      items: {
        $objectToArray: '$items',
      },
    },
  },
  { $unwind: '$items' },
  {
    $project: {
      items: '$items.v',
    },
  },
  {
    $group: {
      _id: null,
      items: {
        $push: '$items',
      },
    },
  }
];
首先,我们使用
$project
&
$objectToArray
字段将其转换为一个数组,以便使用
$unwind
。这样,我们将有不同
项的文档。现在,我们使用另一个
$project
进行转换,使其成为字符串而不是对象(即
{v:,k:}
),最后,我们将它们组合在一起

最终结果:


要准确获取该列表,您需要在代码中访问
字段,如
结果[0]。项(
[0]
,因为聚合将返回一个数组).

这太完美了。我查看了文档,它们都可以作为id:item来实现……但现在您又向前迈出了一步,将id发送为null,并将其余项目发送到一个数组中。非常感谢!这使它成为一个文档。这应该适用于较小的数据集。如果文档大小大于16 MB,则此操作将失败。(和我一样)。在本例中没有考虑文档大小。但是如果您的文档很大,您也可以使用
$project
阶段作为第一阶段,仅投影所需字段(可能
是您唯一需要的)。而不必查看您的文档类型(因为大小限制),很难确定改进的地方:)No@Gytis TG。最终输出文档,即{u-id:null,items:[]}超过了16MB的限制,因为它在数组中有30万个项。输出的总大小对我来说是52MB。这就是为什么,我将其作为[{u-id:'item11'},{u-id:'item21'},{…},]。因此,每个文档只有几个字节。但是输出的最终大小仍然是~52MB。非常感谢您的回答。它非常有见解。可能在其他时间派上用场。