javascript - Mongoose 获取有条件的字段
问题描述
我有这样的架构:
parentId: Number
name:[
new Schema({
language: { type: String, enum: ['en-US', 'fr-CA'] },
text: String,
},{ _id: false }
);
],
isActive: Boolean
...
和如下示例数据:
{
parentId:1,
"name": [
{"language": "en-US", "text": "Book"},
{"language": "fr-CA", "text": "livre"}
],
isActive:true
// and so many other fields
},
{
parentId:1,
"name": [
{"language": "en-US", "text": "Pen"}
],
isActive:true
// and so many other fields
}
我的猫鼬搜索法语文本:
db.langs.find({
"name.language":"fr-CA", parentId: 1
})
Q1。我怎样才能像这样用法语返回名称:
{
parentId:1,
"name": "livre",
isActive:true
// and so many other fields
}
Q2。猫鼬有没有可能我可以返回法语文本,如果法语不存在,它会返回英语?
{
parentId:1,
"name": "livre",
isActive:true
// and so many other fields
},
{
parentId:1,
"name": "pen",
isActive:true
// and so many other fields
}
解决方案
问题一:
您可以使用它$unwind
来解构数组并$match
像一个对象一样。并且最少用所需的值$addFields
覆盖name
字段(如果有多个字段比使用更好的选择$project
)。所有这些都在这样的聚合管道中:
db.collection.aggregate([
{
"$match": {
"parentId": 1
}
},
{
"$unwind": "$name"
},
{
"$match": {
"name.language": "fr-CA"
}
},
{
"$addFields": {
"name": "$name.text"
}
}
])
这里的例子
问题2:
您可以使用$facet
创建“两种方式”。如果存在法语结果,则一个,如果不存在,则另一个。然后检查是否存在以输出一个值或另一个值,如下所示:
db.collection.aggregate([
{
"$match": {
"parentId": 1
}
},
{
"$unwind": "$name"
},
{
"$facet": {
"french": [
{
"$match": {
"name.language": "fr-CA"
}
}
],
"notFrench": [
{
"$match": {
"name.language": "en-US"
}
}
]
}
},
{
"$project": {
"result": {
"$cond": {
"if": {
"$eq": [
{
"$size": "$french"
},
0
]
},
"then": "$notFrench",
"else": "$french"
}
}
}
}
])
这里的例子
推荐阅读
- job-scheduling - 如果前一个作业之一处于终止状态,autosys 作业会运行吗?
- kotlin - 如何在单击下拉弹出窗口外部时关闭下拉弹出窗口?
- outlook-for-mac - 某些组的日历未在 Mac 的新 Outlook 中显示
- javascript - javascript 在引号处拆分字符串 // Json.parse 给出未定义的对象
- javascript - jquery如何在单击确认按钮时删除弹出父项?
- http - 错误时的代理行为
- c++ - 非法指令:4
- c++ - vscode 扩展来格式化属性名称
- javascript - 如何在javascript中“序列化”函数?
- corda - 当事人自己的身份面临错误:没有为以下交易参与者提供流会话