对象在新数组中传播
Object spread inside of new array
我有一个 Node.js 程序,它使用 Mongo Atlas 搜索索引并利用 MongoDB 驱动程序内部的聚合函数。为了进行搜索,用户将在 URL 的查询参数中传递搜索查询。话虽如此,我正在尝试根据查询参数是否存在来构建搜索对象。为了构建搜索对象,我目前正在使用对象扩展语法和参数短路,如下所示:
const mustObj = {
...(query.term && {
text: {
query: query.term,
path: ['name', 'description', 'specs'],
fuzzy: {
maxEdits: 2.0,
},
},
})
}
这是一个简化版本,因为有更多的参数,但你明白了。
在 MongoDB 搜索查询中,如果您有多个必须满足特定条件的参数,则必须将它们包含在名为 must 的数组中,如下所示:
{
$search: {
compound: {
must: [],
},
},
}
因此,为了包含我的搜索参数,我必须首先使用 Object.keys
将我的 mustObj
转换为一个对象数组并将它们映射到一个数组,然后分配搜索 'must' 数组到我创建的数组,像这样:
const mustArr = Object.keys(mustObj).map((key) => {
return { [key === 'text2' ? 'text' : key]: mustObj[key] };
});
searchObj[0].$search.compound.must = mustArr;
我想做的是,不是创建 mustObj
然后循环整个事情来创建一个数组,而是使用扩展语法和短路方法创建数组我创建对象时使用。
我试过下面的代码,但没有用。我收到 'object is not iterable' 错误:
const mustArr = [
...(query.term && {
text: {
query: query.term,
path: ['name', 'description', 'specs'],
fuzzy: {
maxEdits: 2.0,
},
},
})
]
总而言之,我的问题是,我的要求是否可行?如果是,怎么做?
根据@VLAZ 评论更正:
而 spread
与数组 [...(item)]
,item
必须是数组(可迭代)。
使用短路时,item
如下,
true && [] ==> will be `[]` ==> it will work
false && [] ==> will be `false` ==> wont work (because false is not array)
尝试一些类似的东西(类似于@Chau 的建议)
const mustArr = [
...(query.term ? [{
text: {
query: query.term,
path: ['name', 'description', 'specs'],
fuzzy: {
maxEdits: 2.0,
},
},
}] : [])
]
我有一个 Node.js 程序,它使用 Mongo Atlas 搜索索引并利用 MongoDB 驱动程序内部的聚合函数。为了进行搜索,用户将在 URL 的查询参数中传递搜索查询。话虽如此,我正在尝试根据查询参数是否存在来构建搜索对象。为了构建搜索对象,我目前正在使用对象扩展语法和参数短路,如下所示:
const mustObj = {
...(query.term && {
text: {
query: query.term,
path: ['name', 'description', 'specs'],
fuzzy: {
maxEdits: 2.0,
},
},
})
}
这是一个简化版本,因为有更多的参数,但你明白了。
在 MongoDB 搜索查询中,如果您有多个必须满足特定条件的参数,则必须将它们包含在名为 must 的数组中,如下所示:
{
$search: {
compound: {
must: [],
},
},
}
因此,为了包含我的搜索参数,我必须首先使用 Object.keys
将我的 mustObj
转换为一个对象数组并将它们映射到一个数组,然后分配搜索 'must' 数组到我创建的数组,像这样:
const mustArr = Object.keys(mustObj).map((key) => {
return { [key === 'text2' ? 'text' : key]: mustObj[key] };
});
searchObj[0].$search.compound.must = mustArr;
我想做的是,不是创建 mustObj
然后循环整个事情来创建一个数组,而是使用扩展语法和短路方法创建数组我创建对象时使用。
我试过下面的代码,但没有用。我收到 'object is not iterable' 错误:
const mustArr = [
...(query.term && {
text: {
query: query.term,
path: ['name', 'description', 'specs'],
fuzzy: {
maxEdits: 2.0,
},
},
})
]
总而言之,我的问题是,我的要求是否可行?如果是,怎么做?
根据@VLAZ 评论更正:
而 spread
与数组 [...(item)]
,item
必须是数组(可迭代)。
使用短路时,item
如下,
true && [] ==> will be `[]` ==> it will work
false && [] ==> will be `false` ==> wont work (because false is not array)
尝试一些类似的东西(类似于@Chau 的建议)
const mustArr = [
...(query.term ? [{
text: {
query: query.term,
path: ['name', 'description', 'specs'],
fuzzy: {
maxEdits: 2.0,
},
},
}] : [])
]