node.js - MongoDB对象属性检查嵌套数组中是否存在具有特定值的$
问题描述
我有一个这样的数据库集合。
{
"name" : "test",
"gender" : "male",
"attributes" : [
{
"field_id" : "123",
"field_value" : "['Public']"
},
{
"field_id" : "124",
"field_value" : "true"
},
{
"field_id" : "125",
"field_value" : "['Single']"
},
]
},
{
"name" : "test2",
"gender" : "male",
"attributes" : [
{
"field_id" : "125",
"field_value" : "['Married']"
},
]
},
{
"name" : "test3",
"gender" : "male",
"attributes" : [
{
"field_id" : "123",
"field_value" : "['Public']"
},
{
"field_id" : "125",
"field_value" : "['Married']"
},
]
},
{
"name" : "test4",
"gender" : "male",
"attributes" : [
{
"field_id" : "123",
"field_value" : "['Private']"
},
]
},
{
"name" : "test4",
"gender" : "male",
"attributes" : [
]
}
]
我想获取所有具有field_id
as123
和field_value
as 的记录"Public"
;+field_id
123
属性下不存在的记录。
我试过了
var condition = { "attributes" : {$elemMatch:{field_id:"123",field_value:{ $in:["Public"] }}}};
queryObj.push(condition);
这可以很好地获取具有 field_id
as123
和field_value
as 的记录Public
但我也想获取field_id
as123
不存在的记录,我试过这个
var condition1 =
{ "attributes" : {$elemMatch:{field_id:"123",$exists:false}}}
queryObj.push(condition1);
但它返回一个错误,因为它的语法不正确。请指导我如何根据需要获取。
这是预期的输出,因为这些记录中只有Public
值123
field_id
或不存在。field_id
123
[
{
"name" : "test",
"gender" : "male",
"attributes" : [
{
"field_id" : "123",
"field_value" : "['Public']"
},
{
"field_id" : "124",
"field_value" : "true"
},
{
"field_id" : "125",
"field_value" : "['Single']"
},
]
},
{
"name" : "test3",
"gender" : "male",
"attributes" : [
{
"field_id" : "123",
"field_value" : "['Public']"
},
{
"field_id" : "125",
"field_value" : "['Married']"
},
]
},
{
"name" : "test2",
"gender" : "male",
"attributes" : [
{
"field_id" : "125",
"field_value" : "['Married']"
},
]
},
{
"name" : "test4",
"gender" : "male",
"attributes" : [
]
}
]
解决方案
您应该将两个 $elemMatch 与 $or 运算符一起使用。
您的查询应该是这样的。
db.collection.find({
$or: [
{
"attributes": {
"$elemMatch": {
field_id: "123",
field_value: "['Public']"
}
}
},
{
"attributes": {
"$not": {
"$elemMatch": {
field_id: "123"
}
}
}
}
]
})
推荐阅读
- android - BLE:如何发送写请求而不是写命令?
- reactjs - redux 的类型 / 像装饰器一样连接
- asp.net-mvc - 从外部类返回视图
- javascript - 在具有特定键的特定值的数组中查找对象的索引
- wix - 您如何在每次启动时检测已安装的产品版本?
- facebook - Facebook JS SDK 和分享按钮错误
- intellij-idea - IntelliJ Ultimate 无法从 SAP PI WSDL 文件生成代码
- pandas - 熊猫分组并从列表的行转换为大文件的列(无转置)
- jsp - 通过自定义标签从 JSP 获取应用程序字段
- autodesk-forge - 有没有办法知道 Forge API 中文件夹何时有子文件夹?