java mongodb 数组查询_索引MongoDB数组位置查询

本文探讨了MongoDB中多键索引的特性,指出其只索引数组值而不考虑位置。为了解决这个问题,建议在文档中添加表示数组位置的键,并创建复合索引。通过示例展示了如何在查询时使用$elemMatch操作符来匹配特定位置的数组元素。这种方法虽然需要手动管理'k'字段,但能实现更精确的查询。插入和更新操作可能较为复杂,需要预先知道最大k值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MongoDB的多键索引仅索引数组的值,而不是数组中所述值的位置 .

话虽如此,有一种可能的解决方法可以满足您的需求 .

您需要存储一个显示元素位置的“键”,而不是仅存储数组的值 . 使用你的例子:

> db.test.find()

{

"_id": 0,

"a": [

{"k": 0, "v": true},

{"k": 1, "v": false},

{"k": 2, "v": null},

{"k": 3, "v": true}

]

}

{

"_id": 1,

"a": [

{"k": 0, "v": false},

{"k": 1, "v": null},

{"k": 2, "v": true},

{"k": 3, "v": true}

]

}

请注意,在上面的示例中,我使用带有 k 字段的子文档来表示"array position",并使用字段 v 来存储"array element" .

然后,您可以创建索引两个字段的索引:

db.test.createIndex({'a.k':1, 'a.v':1})

查询应该使用$elemMatch operator来确保整个子文档匹配 . 让's say you'重新搜索 k 的2和 v 的 true :

> db.test.find({a: {$elemMatch: {k:2, v:true}}})

{

"_id": 1,

"a": [

{"k": 0, "v": false},

{"k": 1, "v": null},

{"k": 2, "v": true},

{"k": 3, "v": true}

]

}

这种方法的一个缺点是您需要对 k 字段进行自己的管理 . 插入数组有点复杂,因为如果要像处理数组索引那样处理 k ,在执行 $push 之前必须知道 k 的最高值 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值