mongodb 如何在Mongoose中利用部分索引进行复合索引文档的检索

mfuanj7w  于 2023-06-05  发布在  Go
关注(0)|答案(1)|浏览(219)

嗨,我有一个组合索引模式,可以在我的MongoDB中保持邮件和组织的独特组合,就像这样

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);

我想查询所有文件,匹配一个特定的组织ID,而不给一个邮件(从组织的目的上市)我读过一些关于这一点

await Contact
   .find(
      {
         _id:{
            organisation:organisation,
            mail:{"$exists":true}
         }
      }
   )

但是我得到一个空的结果,所以我尝试了一些正则表达式

await Contact
   .find(
      {
         _id:{
            organisation:organisation,
            mail:{"$regex":"[^]*"}
         }
      }
   )

但我一直得到相同的空结果,唯一一次我得到的结果是当精确的文件的确切邮件,但它的无用清单的所有邮件的一个组织
有人知道我做错了什么吗?对不起,我是NodeJS > Mongoose > MongoDB Stack的新手

g0czyy6m

g0czyy6m1#

这里遇到的问题与查询中指定完整嵌套文档时的语义有关。根据文件:
整个嵌入文档的相等匹配需要指定<value>文档的 exact 匹配,包括字段顺序。
因此,问题中的第一个查询是查找_id值正好是{ organisation:organisation, mail:{"$exists":true} }(此时organisation变量的任何值)的文档。由于_id的子字段中的$的限制,我不得不使用不同的字段名,但您可以在this playground demo中看到问题和语义的一般示例。
你需要的是使用点表示法。具体来说,比如:

db.collection.find({
  "_id.organisation": 123,
  "_id.mail": {
    "$exists": true
  }
})

参见playground demonstration here

相关问题