gpt4 book ai didi

arrays - 如何在子文档的每个字段中搜索

转载 作者:可可西里 更新时间:2023-11-01 09:14:24 24 4
gpt4 key购买 nike

这是我的文档:

{ "_id" : ObjectId("5259b73b4949e0b22608960d"), "array" : [  "a",  "b" ] }

要在 array 字段中查找一些值,我使用以下查询:

db.collection.find({roles: 'a'})

但是当 array 字段看起来像这样时,我遇到了问题:

{ "array": { '0': 'a', '1' : 'b' } }

如何使用这种数组(实际上是所有字段都是数组索引的子文档)执行与以前相同的查询?所以我需要找到一个文档,其中任何子文档的字段都等于某物。

很遗憾,我无法更改此字段,因为它是由第 3 端 API 生成的。

最佳答案

我认为没有比使用 the $where operator 更好的选择了,它允许您通过指定自定义 JavaScript 函数来过滤集合。

请注意,对于大型集合,这可能会带来性能问题,因为 $where条件不能利用索引。

OK,回到问题:在{ "array": { '0': 'a', '1' : 'b' } }文字,array从技术上讲不是数组,而是具有属性 '0' 的对象, '1' , 和 '2' .

假设所有array对象将具有从 '0' 开始的连续属性列表,您可以迭代直到找到匹配项或数字 i为此 array[i]undefined (表示连续属性序列的结束)。

实现这一点的 JavaScript 函数是:

function () {
for(var i = 0; this.array[i] !== undefined; i++) {
if(this.array[i] === 'b') {
return true;
}
}

return false;
}

为了轻松地将其粘贴到 Mongo shell 中,这里是单行版本:

function () {for(var i=0; this.array[i]!==undefined; i++) {if(this.array[i]==='b') {return true; } } return false; }

注意上面脚本的两点:

  • this.array如果属性的名称不同于 "array",则应进行更改
  • 'b'是要在“数组” 中搜索的值。将其更改为您正在搜索的任何内容。

因此,使用上面的脚本,您可以在 Mongo shell 中编写以下内容:

db.arraycollection.find({$where: function() {for(var i=0; this.array[i]!==undefined; i++) {if(this.array[i]==='b') {return true; } } return false; }});

稍微简化一下,因为这是 find() 的唯一条件, 我们可以省略 $where总而言之,只留下 js 函数作为参数:

db.arraycollection.find(function() {for(var i=0; this.array[i]!==undefined; i++) {if(this.array[i]==='b') {return true; } } return false; });

PS:很抱歉上面的长行让你滚动,但我认为单行代码更方便粘贴到 Mongo shell 中。

关于arrays - 如何在子文档的每个字段中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19339251/

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