MongoDB 数据不对称 return,数组中的第一项 return 完整,其余部分省略了某些属性?
MongoDB assymetrical return of data, first item in array returned in full, the rest with certain properties omitted?
我是 MongoDB 的新手,正在掌握它的语法和功能。为了实现标题中描述的功能,我相信我可以创建一个承诺,该承诺将 运行 对文档进行 2 个同时查询 - 一个用于获取数组中一项的全部内容(或至少是省略的数据)在另一个查询中,到 re-add 之后),按最近日期搜索,另一个到 return 数组减去特定属性。我有以下文件:
{
_id : ObjectId('5rtgwr6gsrtbsr6hsfbsr6bdrfyb'),
uuid : 'something',
mainArray : [
{
id : 1,
title: 'A',
date: 05/06/2020,
array: ['lots','off','stuff']
},
{
id : 2,
title: 'B',
date: 28/05/2020,
array: ['even','more','stuff']
},
{
id : 3,
title: 'C',
date: 27/05/2020,
array: ['mountains','of','knowledge']
}
]
}
我想 return
{
uuid : 'something',
mainArray : [
{
id : 1,
title: 'A',
date: 05/06/2020,
array: ['lots','off','stuff']
},
{
id : 2,
title: 'B'
},
{
id : 3,
title: 'C'
}
]
}
与构建一个可实现此目的的查询相比,promise 方法的有效性和性能如何?我不知道如何在 MongoDB 中执行这样的 'combined-rule'/条件,如果有人能举个例子吗?
如果您要省略的子文档数组不是很大。我只是在应用程序端删除它。在 MongoDB 中进行处理意味着您选择使用 MongoDB 的计算资源而不是您的应用程序。一般来说,您的应用程序更容易扩展且成本更低,因此最好在应用程序层实施。
但在这种情况下,在 MongoDB 中实现它并不太复杂:
db.collection.aggregate([
{
$addFields: { // keep the first element somewhere
first: { $arrayElemAt: [ "$mainArray", 0] }
}
},
{
$project: { // remove the subdocument field
"mainArray.array": false
}
},
{
$addFields: { // join the first element with the rest of the transformed array
mainArray: {
$concatArrays: [
[ // first element
"$first"
],
{ // select elements from the transformed array except the first
$slice: ["$mainArray", 1, { $size: "$mainArray" }]
}
]
}
}
},
{
$project: { // remove the temporary first elemnt
"first": false
}
}
])
我是 MongoDB 的新手,正在掌握它的语法和功能。为了实现标题中描述的功能,我相信我可以创建一个承诺,该承诺将 运行 对文档进行 2 个同时查询 - 一个用于获取数组中一项的全部内容(或至少是省略的数据)在另一个查询中,到 re-add 之后),按最近日期搜索,另一个到 return 数组减去特定属性。我有以下文件:
{
_id : ObjectId('5rtgwr6gsrtbsr6hsfbsr6bdrfyb'),
uuid : 'something',
mainArray : [
{
id : 1,
title: 'A',
date: 05/06/2020,
array: ['lots','off','stuff']
},
{
id : 2,
title: 'B',
date: 28/05/2020,
array: ['even','more','stuff']
},
{
id : 3,
title: 'C',
date: 27/05/2020,
array: ['mountains','of','knowledge']
}
]
}
我想 return
{
uuid : 'something',
mainArray : [
{
id : 1,
title: 'A',
date: 05/06/2020,
array: ['lots','off','stuff']
},
{
id : 2,
title: 'B'
},
{
id : 3,
title: 'C'
}
]
}
与构建一个可实现此目的的查询相比,promise 方法的有效性和性能如何?我不知道如何在 MongoDB 中执行这样的 'combined-rule'/条件,如果有人能举个例子吗?
如果您要省略的子文档数组不是很大。我只是在应用程序端删除它。在 MongoDB 中进行处理意味着您选择使用 MongoDB 的计算资源而不是您的应用程序。一般来说,您的应用程序更容易扩展且成本更低,因此最好在应用程序层实施。
但在这种情况下,在 MongoDB 中实现它并不太复杂:
db.collection.aggregate([
{
$addFields: { // keep the first element somewhere
first: { $arrayElemAt: [ "$mainArray", 0] }
}
},
{
$project: { // remove the subdocument field
"mainArray.array": false
}
},
{
$addFields: { // join the first element with the rest of the transformed array
mainArray: {
$concatArrays: [
[ // first element
"$first"
],
{ // select elements from the transformed array except the first
$slice: ["$mainArray", 1, { $size: "$mainArray" }]
}
]
}
}
},
{
$project: { // remove the temporary first elemnt
"first": false
}
}
])