使用mongodb驱动程序为node.js返回嵌套数组中的第一个元素

时间:2014-12-29 00:33:47

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

我正在使用node.js的mongodb驱动程序来查询我的MongoDB文档存储。

我在名为companies的文档存储中包含以下数据:

{
  companyName: "My Company",
  users: [
    {
      first: "Nick",
      last: "Kewney",
      email: test@user.com,
      username: "this.username",
      company: "Test Company",
    }
  ],
  _id: ObjectId("54a0831fcad79dbf082d65e0")
}

我想查询商店并查找用户名为“this.username”的所有用户并返回第一个。

我的尝试将返回单个结果,但是作为数组。

db.companies.findOne({ "users.username": "this.username" }, {_id: 0, 'users.$': 1}, next);

...返回

{
  "users": [
    {
      "first": "Nick",
      "last": "Kewney",
      "email": "test@test.com",
      "username": "this.username",
      "company": "Test Company"
    }
  ]
}

我想要的结果只是第一项,例如

    {
      "first": "Nick",
      "last": "Kewney",
      "email": "test@test.com",
      "username": "this.username",
      "company": "Test Company"
    }

1 个答案:

答案 0 :(得分:1)

对于MongoDB的.find()方法可用的基本投影操作,可以做些什么是有限制的。 ,findOne()基本上只包装.find()以返回单个文档而不是光标。但这些基本相同。

如果要在服务器返回结果中进行第一次操作,则需要.aggregate()方法。这有一个比进一步操作更详细的$project阶段,以及其他阶段操作符来获得结果:

db.companies.aggregate(
    [
        // Query argument to match document
        { "$match": {
            "users.username": "this.username"
        }},

        // Flatten array out
        { "$unwind": "$users" },

        // Filter array
        { "$match": {
            "users.username": "this.username"
        }},

        // Project wanted fields
        { "$project": {
            "_id": 0,
            "first": "$users.first",
            "last": "$users.last",
            "username": "$users.username",
            "email": "$users.email",
            "company": "$users.company"
        }}
    ],
    function(err,result) {

    }
);

这将为您提供重组文档的结果,如果需要,还可以将多个数组项的可能匹配作为单独的结果返回。

但是对于我的钱,通常只能接受你从基本投影得到的东西。当然它是嵌套的,并且仍然是一个只有一个项目的数组,但这很容易编码来操纵你的响应。特别是如果您真正在预期的代码中使用.findOne(),那么一个结果就不难在那里操作。