收藏
回答

$.size(any [])参数必须是数组,这样为何出不来想要的数据?该如何写?

集合test中有下面的记录:

  {
    "_id": "79550af26029c54004de448f1d38f5fb",
    "friends": [
      {
        "ah": [
          "足球",
          "羽毛球"
        ]
      },
      {
        "ah": [
          "乒乓球"
        ]
      }
    ],
    "xm": "张三"
  }
想获取friends数组中第一个元素中ah数组元素的个数,下面的写法却不是想要的结果,该如何写呢,谢谢哈~
db.collection('test').aggregate()
  .project({
    size: $.size('$friends.0.ah')
  })
  .end()

x希望得到的数据是
[
  {
    "_id": "79550af26029c54004de448f1d38f5fb",
    "size": 2
  }
]
但实际size却是0

回答关注问题邀请回答
收藏

1 个回答

  • 2021-02-15

    刚才看到一位朋友回答问题,并再次进行的问询,结果莫名其妙,刷新后啥都没了,非常非常抱歉啊

    那位朋友说是这样操作:

    db.collection('test').aggregate()
    .project({
      na: $.arrayElemAt(['$friends',0])
    })
    .project({
      size: $.size('$na.ah')
    })
    .end()
    

    非常棒,只是我想知道原来的写法为何不行,其实我原本是想用在match中,满足条件的记录直接进行更新。

    db.collection('test').aggregate()
      .match(
        _.expr(
          $.lt([$.size($.ifNull(['$friends.0.ah',[]])),2])
        )
      )
      .end()
    

    小于2条记录的会查询到,这里应该等于2,不会被查询到才对,但因size大小是0所以会被查询到,这是不应该的。

    2021-02-15
    有用
    回复 2
登录 后发表内容
问题标签