如何在Mongoose中使用部分索引的复合索引文档中进行搜索。

huangapple go评论71阅读模式
英文:

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:{&quot;$exists&quot;: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 &lt;value&gt; 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:{&quot;$exists&quot;: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({
  &quot;_id.organisation&quot;: 123,
  &quot;_id.mail&quot;: {
    &quot;$exists&quot;: true
  }
})

See the playground demonstration here.

huangapple
  • 本文由 发表于 2023年5月28日 05:44:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/76349167.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定