查找在数组中包含特定值但不是最后一个元素的文档

发出者

我当前的方法是:

var v = 'Value';
Collection.find({arrayToLookIn: v}).forEach(function(obj) {
  if (obj.arrayToLookIn.indexOf(v) !== obj.arrayToLookIn.length - 1) {
    // do stuff
  }
}

我想知道是否有一种方法可以在find()调用中指定这样的规则,而无需进行内部检查?

我浏览了https://docs.mongodb.org/manual/tutorial/query-documents/#match-an-array-element,但没有发现我所寻找的东西。

第一个问题,请保持温柔:)

布雷克七世

您现在可以做什么

您需要$where,可以使用JavaScript评估来匹配文档。因此,您在这里要求评估代码测试每个数组元素,而不是最后一个:

Collection.find({
    "arrayToLookIn": v,
    "$where": function() {
        var array = this.arrayToLookIn;
        array.pop();                    // remove last element
        return array.some(function(el) { return el == 'Value' });
    }
})

请注意,由于它是JavaScript发送到服务器的,因此需要在该代码中指定“值”,而不是使用变量。您可以选择将JavaScript代码构造为“字符串”,以将该变量作为文字加入其中,并将其作为参数提交给$where

请注意,我将保留基本的等式匹配项,因为$where使用这样的索引无法进行匹配,因此它的工作是“过滤”出匹配项在最后一个元素上的结果,而不是测试每个文档来查找是否甚至还在那里。


更好的未来之路

令人好奇的是,截至当前的MongoDB 3.0版本系列,还没有一种真正有效的方法来使用聚合框架,因此JavaScript评估是更好的选择。

您现在需要做一些愚蠢的事情,例如在$groupafter之后找到最后一个元素$unwind,然后再$match逐个列出值$unwind如果值存在多次,效率不高且容易出错。

将来的发行版中将有一个$slice运算符,可以将其与一起使用$redact

Collection.aggregate([
    // Still wise to do this as mentioned earlier
    { "$match": { "arrayToLookIn": v } },

    // Then only return if the match was not in the last element
    { "$redact": {
        "$cond": {
            "if": {
                "$setIsSubset": [
                    [v],
                    { "$slice": [
                        "$arrayToLookIn",
                        0,
                        { "$subtract": [ { "$size": "$arrayToLookIn" }, 1 ] }
                    ]}
                ]
            },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }
    }}

在哪里$setIsSubset做这已经通过删除它的最后一个数据阵列的比较$slice仅返回从元素0$size零下1

并且$where,当下一个具有$slice聚合功能的版本可用时,它应该比使用本机编码操作进行比较更为有效

更不用说$unwind还可以选择在以后的版本中包括索引位置。但是即使添加了它,也不是一个很好的选择。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

查找在数组中包含特定值但不是最后一个元素的文档

来自分类Dev

使用Mongoose查找具有不同值的文档数组中的最后一个文档

来自分类Dev

在数组中查找与Swift中的特定条件匹配的第一个元素

来自分类Dev

在数组中查找与Swift中的特定条件匹配的第一个元素

来自分类Dev

Mongodb:按数组最后一个元素中的值对文档进行排序

来自分类Dev

EXCEL查找数组中的最后一个相对最大值(公式,不是VBA)

来自分类Dev

在数组的数组中查找第一个元素,第二个元素的值最高

来自分类Dev

在数组中,如何以我希望打印的值而不是最后一个值的方式打印值?

来自分类Dev

查找数组中的最后一个元素

来自分类Dev

如何查找包含元素与另一个数组中的其他元素匹配的数组的文档?

来自分类Dev

使用字符串连接在c中打印数组,但不包含最后一个元素

来自分类Dev

在numpy数组中查找最后一个值

来自分类Dev

Python-查找元素,如果前一个在xpath中包含特定类型的值

来自分类Dev

MongoDB查询包含至少一个在数组中指定的值之一的文档

来自分类Dev

查找列中的最后一个值(而不是最后一行)

来自分类Dev

MongoDB:在文档中查找一个元素,该元素包含一个带有数组的子对象的对象

来自分类Dev

在Mongoose中,如何找到与给定查询值匹配的数组字段的最后一个元素的所有文档?

来自分类Dev

按与过滤器匹配的数组的最后一个元素中的值对文档进行排序。Mongodb

来自分类Dev

在包含值的字符串数组中查找字符串的最后一个索引

来自分类Dev

在数组中添加属性。添加所有数组中的最后一个值

来自分类Dev

在行数组中查找最后一列的最后一个值

来自分类Dev

根据mongo db php中嵌入文档的最后一个元素的字段查找

来自分类Dev

获取对象的一个元素,该元素不包含在数组中

来自分类Dev

如何根据另一个数组 swift 3 在数组中包含元素

来自分类Dev

在数组php中查找第一个和最后一个匹配序列

来自分类Dev

在数组中查找一个元素,其中每个元素比其前一个元素多一个或一个小

来自分类Dev

在数组中查找一个元素,其中每个元素比其前一个元素多一个或少一个

来自分类Dev

PHP:While 循环将最后一个值保存在数组中

来自分类Dev

查找数组中的第一个、最后一个和中间值。返回最大的一个

Related 相关文章

  1. 1

    查找在数组中包含特定值但不是最后一个元素的文档

  2. 2

    使用Mongoose查找具有不同值的文档数组中的最后一个文档

  3. 3

    在数组中查找与Swift中的特定条件匹配的第一个元素

  4. 4

    在数组中查找与Swift中的特定条件匹配的第一个元素

  5. 5

    Mongodb:按数组最后一个元素中的值对文档进行排序

  6. 6

    EXCEL查找数组中的最后一个相对最大值(公式,不是VBA)

  7. 7

    在数组的数组中查找第一个元素,第二个元素的值最高

  8. 8

    在数组中,如何以我希望打印的值而不是最后一个值的方式打印值?

  9. 9

    查找数组中的最后一个元素

  10. 10

    如何查找包含元素与另一个数组中的其他元素匹配的数组的文档?

  11. 11

    使用字符串连接在c中打印数组,但不包含最后一个元素

  12. 12

    在numpy数组中查找最后一个值

  13. 13

    Python-查找元素,如果前一个在xpath中包含特定类型的值

  14. 14

    MongoDB查询包含至少一个在数组中指定的值之一的文档

  15. 15

    查找列中的最后一个值(而不是最后一行)

  16. 16

    MongoDB:在文档中查找一个元素,该元素包含一个带有数组的子对象的对象

  17. 17

    在Mongoose中,如何找到与给定查询值匹配的数组字段的最后一个元素的所有文档?

  18. 18

    按与过滤器匹配的数组的最后一个元素中的值对文档进行排序。Mongodb

  19. 19

    在包含值的字符串数组中查找字符串的最后一个索引

  20. 20

    在数组中添加属性。添加所有数组中的最后一个值

  21. 21

    在行数组中查找最后一列的最后一个值

  22. 22

    根据mongo db php中嵌入文档的最后一个元素的字段查找

  23. 23

    获取对象的一个元素,该元素不包含在数组中

  24. 24

    如何根据另一个数组 swift 3 在数组中包含元素

  25. 25

    在数组php中查找第一个和最后一个匹配序列

  26. 26

    在数组中查找一个元素,其中每个元素比其前一个元素多一个或一个小

  27. 27

    在数组中查找一个元素,其中每个元素比其前一个元素多一个或少一个

  28. 28

    PHP:While 循环将最后一个值保存在数组中

  29. 29

    查找数组中的第一个、最后一个和中间值。返回最大的一个

热门标签

归档