【问题标题】:Count number of keys inside an object in mongodb [duplicate]计算mongodb中对象内的键数[重复]
【发布时间】:2019-01-12 02:40:51
【问题描述】:

我想知道一场演出订了多少座位。

每个演出文档中都有一个“showTakenSeats”对象。

这里是初始数据:

    [
    {
        "_id": "5b658d37692f2e3c881960cb",
        "_MovieId": "5b5835dd86ab401494263861",
        "_TheaterId": "5b3dfeb217bc8c23f0e7ec3f",
        "dateTime": "2018-08-04T14:00:00.000Z",
        "showTakenSeats": {
            "0-0": "5b658f79dd8bb938289e2e0b",
            "0-1": "5b658f79dd8bb938289e2e0b",
            "0-2": "5b658f79dd8bb938289e2e0b"
        },
        "__v": 0,
    },
    {
        "_id": "5b658d4a692f2e3c881960cc",
        "_MovieId": "5b584eb186ab401494263868",
        "_TheaterId": "5b45d269a53b0c05f8959260",
        "dateTime": "2018-08-04T13:00:00.000Z",
        "showTakenSeats": {
            "0-0": "5b65904bdd8bb938289e2e0d",
            "0-1": "5b65904bdd8bb938289e2e0d",
            "0-2": "5b65904bdd8bb938289e2e0d"
        },
        "__v": 0,
    },
    {
        "_id": "5b658fd1dd8bb938289e2e0c",
        "_MovieId": "5b575452478afb72ec65f8f6",
        "_TheaterId": "5b45d219a53b0c05f895925f",
        "dateTime": "2018-08-04T20:00:00.000Z",
        "showTakenSeats": {},
        "__v": 0,
    },
    {
        "_id": "5b6593d80d48d9394877dd09",
        "_MovieId": "5b584eb186ab401494263868",
        "_TheaterId": "5b446a8768db4e2e980723ab",
        "dateTime": "2018-08-05T10:00:00.000Z",
        "showTakenSeats": {},
        "__v": 0,
    },
    {
        "_id": "5b65943b0d48d9394877dd0a",
        "_MovieId": "5b584eb186ab401494263868",
        "_TheaterId": "5b446a8768db4e2e980723ab",
        "dateTime": "2018-08-03T22:00:00.000Z",
        "showTakenSeats": {},
        "__v": 0,
    }
]

这是我的代码:

Show.aggregate([
        {
            $addFields: {'count':Object.keys('$showTakenSeats').length}
        }

    ], function (err, result) {
        if (err) {
            //next(err);
            return res.json(err);
        } else {
            res.json(result);
        }
    });

结果如下:

[
    {
        "_id": "5b658d37692f2e3c881960cb",
        "_MovieId": "5b5835dd86ab401494263861",
        "_TheaterId": "5b3dfeb217bc8c23f0e7ec3f",
        "dateTime": "2018-08-04T14:00:00.000Z",
        "showTakenSeats": {
            "0-0": "5b658f79dd8bb938289e2e0b",
            "0-1": "5b658f79dd8bb938289e2e0b",
            "0-2": "5b658f79dd8bb938289e2e0b"
        },
        "__v": 0,
        "count": 15
    },
    {
        "_id": "5b658d4a692f2e3c881960cc",
        "_MovieId": "5b584eb186ab401494263868",
        "_TheaterId": "5b45d269a53b0c05f8959260",
        "dateTime": "2018-08-04T13:00:00.000Z",
        "showTakenSeats": {
            "0-0": "5b65904bdd8bb938289e2e0d",
            "0-1": "5b65904bdd8bb938289e2e0d",
            "0-2": "5b65904bdd8bb938289e2e0d"
        },
        "__v": 0,
        "count": 15
    },
    {
        "_id": "5b658fd1dd8bb938289e2e0c",
        "_MovieId": "5b575452478afb72ec65f8f6",
        "_TheaterId": "5b45d219a53b0c05f895925f",
        "dateTime": "2018-08-04T20:00:00.000Z",
        "showTakenSeats": {},
        "__v": 0,
        "count": 15
    },
    {
        "_id": "5b6593d80d48d9394877dd09",
        "_MovieId": "5b584eb186ab401494263868",
        "_TheaterId": "5b446a8768db4e2e980723ab",
        "dateTime": "2018-08-05T10:00:00.000Z",
        "showTakenSeats": {},
        "__v": 0,
        "count": 15
    },
    {
        "_id": "5b65943b0d48d9394877dd0a",
        "_MovieId": "5b584eb186ab401494263868",
        "_TheaterId": "5b446a8768db4e2e980723ab",
        "dateTime": "2018-08-03T22:00:00.000Z",
        "showTakenSeats": {},
        "__v": 0,
        "count": 15
    }
]

count 的结果是不正确的。 'Object.keys('$showTakenSeats').length' 似乎一直返回 15。而不是应该不同的实际值。

count的结果应该是(3,3,0,0,0)

有人知道是什么问题吗? 谢谢!

【问题讨论】:

  • 你得到了字符串“$showTakenSeats”的长度。
  • @Pointy 你是对的!知道如何获得所需的值吗?
  • 好吧,恐怕我对您使用的框架不熟悉。

标签: javascript node.js mongodb mongoose aggregation-framework


【解决方案1】:

我不知道聚合框架但是一个简单的javascript解决方案应该是这样的

var  data =   [
    {
        "_id": "5b658d37692f2e3c881960cb",
        "_MovieId": "5b5835dd86ab401494263861",
        "_TheaterId": "5b3dfeb217bc8c23f0e7ec3f",
        "dateTime": "2018-08-04T14:00:00.000Z",
        "showTakenSeats": {
            "0-0": "5b658f79dd8bb938289e2e0b",
            "0-1": "5b658f79dd8bb938289e2e0b",
            "0-2": "5b658f79dd8bb938289e2e0b"
        },
        "__v": 0,
    },
    {
        "_id": "5b658d4a692f2e3c881960cc",
        "_MovieId": "5b584eb186ab401494263868",
        "_TheaterId": "5b45d269a53b0c05f8959260",
        "dateTime": "2018-08-04T13:00:00.000Z",
        "showTakenSeats": {
            "0-0": "5b65904bdd8bb938289e2e0d",
            "0-1": "5b65904bdd8bb938289e2e0d",
            "0-2": "5b65904bdd8bb938289e2e0d"
        },
        "__v": 0,
    },
    {
        "_id": "5b658fd1dd8bb938289e2e0c",
        "_MovieId": "5b575452478afb72ec65f8f6",
        "_TheaterId": "5b45d219a53b0c05f895925f",
        "dateTime": "2018-08-04T20:00:00.000Z",
        "showTakenSeats": {},
        "__v": 0,
    },
    {
        "_id": "5b6593d80d48d9394877dd09",
        "_MovieId": "5b584eb186ab401494263868",
        "_TheaterId": "5b446a8768db4e2e980723ab",
        "dateTime": "2018-08-05T10:00:00.000Z",
        "showTakenSeats": {},
        "__v": 0,
    },
    {
        "_id": "5b65943b0d48d9394877dd0a",
        "_MovieId": "5b584eb186ab401494263868",
        "_TheaterId": "5b446a8768db4e2e980723ab",
        "dateTime": "2018-08-03T22:00:00.000Z",
        "showTakenSeats": {},
        "__v": 0,
    }
]


var withCount = data.map(function(e){
  return Object.assign({count: Object.keys(e.showTakenSeats).length}, e);
})

console.log(withCount);

【讨论】:

  • 谢谢。但它并不适合我
【解决方案2】:

您可以使用$objectToArray将第一个对象转换为数组,然后可以找到数组的$size

Show.aggregate([
  { "$addFields": {
    "count": {
      "$size": {
        "$objectToArray": "$showTakenSeats"
      }
    }
  }}
])

【讨论】:

  • 谢谢。我只是自己想出来的.. :)
  • 很高兴为您提供帮助
猜你喜欢
  • 2018-09-22
  • 1970-01-01
  • 2013-06-03
  • 2018-07-24
  • 1970-01-01
  • 2014-02-24
  • 2021-07-06
  • 1970-01-01
  • 2015-08-26
相关资源
最近更新 更多