Javascript 在数组中收集id
我在mongoDB中有一个带有object的数组。在array sales中,我有id为array products的对象和totalPrice,我需要node.js服务器在sales中返回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": [ {
{
"_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
}
...
]
在arraysales
中,我有一个id为id的对象
arrayproducts
和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数组。