Javascript 在数组中收集id

Javascript 在数组中收集id,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我在mongoDB中有一个带有object的数组。在array sales中,我有id为array products的对象和totalPrice,我需要node.js服务器在sales中返回id为的数组 { "_id": "5d5d066d3d20a50424211e59", "sales": [ { "products": [ {

我在mongoDB中有一个带有object的数组。在array sales中,我有id为array products的对象和totalPrice,我需要node.js服务器在sales中返回id为的数组

     {
        "_id": "5d5d066d3d20a50424211e59",
        "sales": [
            {
                "products": [
                    {
                        "_id": "5d5d066d3d20a50424211e5d",
                        "name": "dsdad",
                        "count": 2,
                        "price": 33.5
                    }
                ],
                "_id": "5d5d066d3d20a50424211e5c",
                "totalPrice": 327.4
            },
            {
                "products": [
                    {
                        "_id": "5d5d066d3d20a50424211e5b",
                        "name": "asda",
                        "count": 3,
                        "price": 324
                    }
                ],
                "_id": "5d5d066d3d20a50424211e5a",
                "totalPrice": 22.4
            }
        ],
        "date": 1566400515,
        "status": true
    }
...
]
在array
sales
中,我有一个id为
id的对象
array
products
totalPrice
我需要node.js服务器在sales中返回ID为的数组

     {
        "_id": "5d5d066d3d20a50424211e59",
        "sales": [
            {
                "products": [
                    {
                        "_id": "5d5d066d3d20a50424211e5d",
                        "name": "dsdad",
                        "count": 2,
                        "price": 33.5
                    }
                ],
                "_id": "5d5d066d3d20a50424211e5c",
                "totalPrice": 327.4
            },
            {
                "products": [
                    {
                        "_id": "5d5d066d3d20a50424211e5b",
                        "name": "asda",
                        "count": 3,
                        "price": 324
                    }
                ],
                "_id": "5d5d066d3d20a50424211e5a",
                "totalPrice": 22.4
            }
        ],
        "date": 1566400515,
        "status": true
    }
...
]
更新。
sales
中的每个对象都有ID。我需要具有此ID的数组。像这样:

{ "_id": "5d5d066d3d20a50424211e5c"},
{"_id": "5d5d066d3d20a50424211e5a"}
]```

只需使用
map()

let数据=
[
{
“_id”:“5d5d066d3d20a50424211e59”,
“销售”:[
{
“产品”:[
{
“_id”:“5d5d066d3d20a50424211e5d”,
“名称”:“dsdad”,
“计数”:2,
“价格”:33.5
}
],
“_id”:“5d5d066d3d20a50424211e5c”,
“总价格”:327.4
},
{
“产品”:[
{
“_id”:“5d5d066d3d20a50424211e5b”,
“名称”:“asda”,
“计数”:3,
“价格”:324
}
],
“_id”:“5d5d066d3d20a50424211e5a”,
“总价格”:22.4
}
],
“日期”:1566400515,
“状态”:正确
}
];
//循环遍历数据数组中的所有项
data.forEach(d=>{
//将每个销售数组转换为销售ID数组
d、 sales=d.sales.map(s=>s[“_id]”);
});
控制台日志(数据)
const结果=[
{
_id:'5d5d066d3d20a50424211e59',
销售:[
{
产品:[
{
_id:'5d5d066d3d20a50424211e5d',
名称:“dsdad”,
计数:2,
价格:33.5,
},
],
_id:'5d5d066d3d20a50424211e5c',
总价:327.4,
},
{
产品:[
{
_id:'5d5d066d3d20a50424211e5b',
名称:“asda”,
计数:3,
价格:324,
},
],
_id:'5d5d066d3d20a50424211e5a',
总价:22.4,
},
],
日期:1566400515,
状态:正确,
},
];
结果.forEach((r)=>{
常数参考=r;
if(reference.sales&&Array.isArray(reference.sales)){
reference.sales=reference.sales.map((m)=>{return m.\u id;});
}
});

控制台日志(结果)您可以使用或导入lodash,并使用下面的代码,它将返回销售ID

let _ = require('lodash');
let data = [
{
_id: '5d5d066d3d20a50424211e59',
sales: [
  {
    products: [
      {
        _id: '5d5d066d3d20a50424211e5d',
        name: 'dsdad',
        count: 2,
        price: 33.5,
      },
    ],
    _id: '5d5d066d3d20a50424211e5c',
    totalPrice: 327.4,
  },
  {
    products: [
      {
        _id: '5d5d066d3d20a50424211e5b',
        name: 'asda',
        count: 3,
        price: 324,
      },
    ],
    _id: '5d5d066d3d20a50424211e5a',
    totalPrice: 22.4,
  },
  ],
   date: 1566400515,
    status: true
  },
 ];


let ids = _.map(data,(d)=>{
 return _.map(d.sales, (saleItem) => {return saleItem._id;});
})

与其在等待从查询中提取文档后运行map,不如使用聚合管道执行此操作,如下所示:

db.collection.aggregate([
  {
    $project: {
      date: 1,
      status: 1,
      sales: {
        $map: {
          input: "$sales",
          as: "item",
          in: "$$item._id"
        }
      }
    }
  }
])

sales=sales.map(s=>s[“\u id”])
你试过什么吗?另外,对于博文作者,你能举一个预期输出的例子吗?就像我说的,
sales
是一个数组,所以我们不能在其中放置
\u id
属性。。。。你想让它们成为销售阵列中的普通字符串吗?@MauriceNino oh dam,你说得对。。。出于某种原因,我把它看错了。哈哈。谢谢你的纠正。所以它会给我一个只包含“_id”属性的数组,如果他想要的话,你是非常好的。
db.collection.aggregate([{“$addFields”:{“sales”:{“$map”:{“input”:“$sales”,“in”:{“_id”:“$$this._id”}}}}])
为什么
const reference=r
this?它的好处是什么?另外,检查元素是否为数组的原因是什么?当您在代码中配置
ESLint
时,它不允许对该变量(
r
)进行更改,如果您尝试发出警告
无parm重新分配
,这就是我获取新变量(
引用
)并对其进行更改的原因,它间接地在
r
中进行更改,因为我们直接分配它
const reference=r;销售和产品的id表示它们来自不同的系列。你确定吗?如果该产品是一个嵌入的对象数组呢?我不确定,但嵌入的对象包括所提到的mongo Id,即使您创建了一个嵌入的对象数组,在对象中保存mongo时,如果未设置,则始终生成用于索引的\u Id。\u Id:False我知道地图。但对我来说更好的是,如果响应将只使用ids,那么您只需要来自数据库查询的id吗?因为这将操作结果并仅返回ID数组。