如果对象键存在,Mongoose 检索文档
Mongoose retrieve documents if object keys exist
我有一个名为 Users 的 mongoose 模式:
let UserSchema = new mongoose.Schema({
firstname: {
type: String,
required: true,
},
lastname: {
type: String,
required: true,
},
houses: {
type: Map,
of: Array,
required:[true,"No Units Detected"]
},
gender: {
type: String,
required: true,
},
email: {
type: String,
required: true,
unique: true,
lowercase: true,
validate: (value) => {
return validator.isEmail(value);
},
},
这导致文档被保存为:
文档 1:
{
firstname:"user1",
lastname:"user",
gender:"male",
email:"user@users.com",
houses: {
"New York" : ['house1','house2']
"Florida" : ['house1','house2']
}
}
文档 2:
{
firstname:"user2",
lastname:"user",
gender:"female",
email:"user2@users.com",
houses: {
"Florida" : ['house1']
"Texas" : ['house1']
}
}
这些模式的目的是列出每个用户的房屋,即使用户在多个州拥有多个房屋。
我的问题是:是否有任何查询可以用来列出处于特定状态的用户(这是对象内的键)
例如 :
查询德克萨斯州 return 仅限用户 2,查询佛罗里达州 return 用户 1 和用户 1
方法一:使用$exist
db.collection.aggregate([
{
$match: {
"houses.Texas": { $exists: true }
}
}
])
方法二:使用$objectToArray
db.collection.aggregate([
{
$match: {
$expr: {
$ne: [
{
$filter: {
input: { $objectToArray: "$houses" },
as: "h",
cond: { $eq: [ "$$h.k", "Texas" ] }
}
},
[]
]
}
}
}
])
我有一个名为 Users 的 mongoose 模式:
let UserSchema = new mongoose.Schema({
firstname: {
type: String,
required: true,
},
lastname: {
type: String,
required: true,
},
houses: {
type: Map,
of: Array,
required:[true,"No Units Detected"]
},
gender: {
type: String,
required: true,
},
email: {
type: String,
required: true,
unique: true,
lowercase: true,
validate: (value) => {
return validator.isEmail(value);
},
},
这导致文档被保存为: 文档 1:
{
firstname:"user1",
lastname:"user",
gender:"male",
email:"user@users.com",
houses: {
"New York" : ['house1','house2']
"Florida" : ['house1','house2']
}
}
文档 2:
{
firstname:"user2",
lastname:"user",
gender:"female",
email:"user2@users.com",
houses: {
"Florida" : ['house1']
"Texas" : ['house1']
}
}
这些模式的目的是列出每个用户的房屋,即使用户在多个州拥有多个房屋。 我的问题是:是否有任何查询可以用来列出处于特定状态的用户(这是对象内的键) 例如 : 查询德克萨斯州 return 仅限用户 2,查询佛罗里达州 return 用户 1 和用户 1
方法一:使用$exist
db.collection.aggregate([
{
$match: {
"houses.Texas": { $exists: true }
}
}
])
方法二:使用$objectToArray
db.collection.aggregate([
{
$match: {
$expr: {
$ne: [
{
$filter: {
input: { $objectToArray: "$houses" },
as: "h",
cond: { $eq: [ "$$h.k", "Texas" ] }
}
},
[]
]
}
}
}
])