英文:
how to search in compound indexed document with partial part of the index in Mongoose
问题
抱歉,以下是您要求的代码部分的中文翻译:
// 定义模式
let Schema = mongoose.Schema({
_id:{
organisation:{
type:mongoose.ObjectId,
required:true,
ref:'organisations'
},
mail:{
type:String,
required:true
}
},
firstName:{
type:String,
},
lastName:{
type:String
},
})
// 一些方法和静态方法在这里
// 创建Contact模型
const Contact = mongoose.model('contacts',Schema);
// 查询特定组织的所有文档,不提供邮件地址(用于组织目的的列表)
await Contact
.find(
{
_id:{
organisation:organisation,
mail:{"$exists":true}
}
}
)
// 使用正则表达式尝试查询
await Contact
.find(
{
_id:{
organisation:organisation,
mail:{"$regex":"[^]*"}
}
}
)
请注意,以上是您提供的代码的中文翻译,没有其他内容。如果您需要更多帮助或有其他问题,请随时提出。
英文:
Hi i have a schema with composed index to keep a unique combinaison of mail and organisation in my MongoDB like this
let Schema = mongoose.Schema({
_id:{
organisation:{
type:mongoose.ObjectId,
required:true
ref:'organisations'
},
mail:{
type:String,
required:true
}
},
firstName:{
type:String,
},
lastName:{
type:String
},
})
//some methods and statics here
const Contact = mongoose.model('contacts',Schema);
I would like to query all documents that match a specific organisation id without giving a mail ( for listing from organisation purpose )
I have read something about this
await Contact
.find(
{
_id:{
organisation:organisation,
mail:{"$exists":true}
}
}
)
but i get an empty result
so I try some regex
await Contact
.find(
{
_id:{
organisation:organisation,
mail:{"$regex":"[^]*"}
}
}
)
but i keep getting the same empty result
the only time I get result is when precising the exact mail of a document but its useless for listing all the mail of an organisation
Does anyone know what am i doing wrong ?
sorry i am kinda new at this NodeJS > Mongoose > MongoDB Stack
答案1
得分: 0
遇到的问题与在查询中指定完整嵌套文档时的语义有关。根据文档:
完全嵌套文档上的相等匹配需要对指定的
<value>
文档进行 精确 匹配,包括字段顺序。
因此,问题中的第一个查询正在寻找一个 _id
值完全为 { organisation:organisation, mail:{"$exists":true} }
(具体取决于 organisation
变量在该时刻的值)。由于在 _id
的子字段中使用 $
存在受限制,因此我不得不使用不同的字段名称,但您可以在此播放示例中看到问题和语义的一般示例。
您实际想要的是使用点符号表示法。具体如下:
db.collection.find({
"_id.organisation": 123,
"_id.mail": {
"$exists": true
}
})
请在此播放演示中查看。
英文:
The problem being encountered here is related to the semantics when a full nested document is specified in the query. Per the documentation:
>Equality matches on the whole embedded document require an exact match of the specified <value>
document, including the field order.
So the first query in the question is looking for a document whose _id
value is exactly { organisation:organisation, mail:{"$exists":true} }
(with whatever value is present for the organisation
variable at the time). I had to use a different field name due to a restriction with the $
in subfields of _id
, but you can see a general example of the problem and semantics in this playground demo.
What you want instead is to use dot notation.Specifically something like:
db.collection.find({
"_id.organisation": 123,
"_id.mail": {
"$exists": true
}
})
See the playground demonstration here.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论