gpt4 book ai didi

javascript - 我可以在 mongo 查询中索引对象吗?

转载 作者:行者123 更新时间:2023-12-02 17:20:14 24 4
gpt4 key购买 nike

使用如下所示的复合索引

db.data.ensureIndex({ userId: 1, myObject: 1 })

下面的查找会使用这个索引吗?

db.data.find({ 
userId: 1,
myObject: {
a:'test',
b:'test2'
}
})

我知道在 Javascript 中对象不会保留它们的顺序,那么 Mongo 中也是一样吗?

如果我的文档中的对象顺序不同,会发生什么情况?

{
_id: ObjectId,
userId:1,
myObject: {
b: 'test',
a: 'test2'
}
},

{
_id: ObjectId,
userId:1,
myObject: {
b: 'test',
a: 'test2'
}
},

{
_id: ObjectId,
userId:2,
myObject: {
b: 'test',
a: 'test2'
}
}

像上面那样对对象进行索引时,属性的顺序重要吗?

编辑:在文档中,http://docs.mongodb.org/manual/core/index-single/它说“在子文档上执行相等匹配时,字段顺序很重要,并且子文档必须完全匹配。”

在他们的示例中,以下内容可行

db.factories.find( { metro: { city: "New York", state: "NY" } } )

但如果地铁领域是相反的,那就行不通了

db.factories.find( { metro: { state: "NY", city: "New York" } } )

那么,当语言本身不支持时,如何保留 Javascript/Node 中的属性顺序呢?

最佳答案

实际上,JavasScript 或 JSON 表示法对象确实保留了它们的顺序。虽然如果 MongoDB 必须随着文档的增长而移动某些顶级属性,则它们可能会重新排列,但一般来说,此“子级”文档不应更改其最初插入的顺序。

也就是说,有些语言默认会尝试对“Hash”、“Map”、“Dict”键进行排序,因此在处理这些键时查找“有序”或“索引”形式变得很重要,但那就是另一个问题。

对于 MongoDB 的“索引”影响此顺序的问题,不,它不会。事实上,您添加的索引虽然不会出错,但作为 Object{} 本质上没有任何值,实际上没有任何值采取行动的索引。

你可以做的是:

db.data.ensureIndex({ "userId": 1, "myObject.a": 1 })

这会在对象的“a”属性上保留升序索引。如果在查询中定期查看此内容,这将非常有用。

如果您尝试像这样查询,您也可能会遇到位置问题:

db.data.find({ "Object": { a: "test2", b: "test" } })

实际存储的 key 不按顺序排列。但这通常通过“点符号”形式来修复:

db.data.find({ "Object.a": "test2", "Object.b": "test" })

它不会关心键的实际顺序。

但是您定义的索引不会按插入顺序保留“键”,这完全是特定于语言的

关于javascript - 我可以在 mongo 查询中索引对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24029582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com