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
最适合大多数场景!但最终这一切都取决于你的要求!只要记住从数据库中获取正确的数据,就可以在代码方面帮助您很多..好的,我知道了。谢谢事实上,我问题中的预期产出的例子是否定的