在$ project阶段重塑文档

时间:2016-09-17 13:53:00

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

我们的收藏品如下:



> db.companies.find().limit(1).pretty() {
  "_id": ObjectId("52cdef7c4bab8bd675297d8b"),
  "name": "AdventNet",
  "permalink": "abc3",
  "crunchbase_url": "http://www.crunchbase.com/company/adventnet",
  "homepage_url": "http://adventnet.com",
  "blog_url": "",
  "blog_feed_url": "",
  "twitter_username": "manageengine",
  "category_code": "enterprise",
  "number_of_employees": 600,
  "founded_year": 1996,
  "deadpooled_year": 2,
  "tag_list": "",
  "alias_list": "Zoho ManageEngine ",
  "email_address": "pr@adventnet.com",
  "phone_number": "925-924-9500",
  "description": "Server Management Software",
  "created_at": ISODate("2007-05-25T19:24:22Z"),
  "updated_at": "Wed Oct 31 18:26:09 UTC 2012",
  "overview": "<p>AdventNet is now <a href=\"/company/zoho-manageengine\"
 title=\"Zoho ManageEngine\" rel=\"nofollow\">Zoho ManageEngine</a>.</p>\n\n<p>F
ounded in 1996, AdventNet has served a diverse range of enterprise IT, networkin
g and telecom customers.</p>\n\n<p>AdventNet supplies server and network managem
ent software.</p>",
  "image": {
    "available_sizes": [
      [
        [
          150,
          55
        ],
        "assets/images/resized/0001/9732/19732v1-max-150
x150.png"
      ],
      [
        [
          150,
          55
        ],
        "assets/images/resized/0001/9732/19732v1-max-250
x250.png"
      ],
      [
        [
          150,
          55
        ],
        "assets/images/resized/0001/9732/19732v1-max-450
x450.png"
      ]
    ]
  },
  "products": [],
  "relationships": [{
    "is_past": true,
    "title": "CEO and Co-Founder",
    "person": {
      "first_name": "Sridhar",
      "last_name": "Vembu",
      "permalink": "sridhar-vembu"
    }
  }, {
    "is_past": true,
    "title": "VP of Business Dev",
    "person": {
      "first_name": "Neil",
      "last_name": "Butani",
      "permalink": "neil-butani"
    }
  }, {
    "is_past": true,
    "title": "Usabiliy Engineer",
    "person": {
      "first_name": "Bharath",
      "last_name": "Balasubramanian",
      "permalink": "bharath-balasibramanian"
    }
  }, {
    "is_past": true,
    "title": "Director of Engineering",
    "person": {
      "first_name": "Rajendran",
      "last_name": "Dandapani",
      "permalink": "rajendran-dandapani"
    }
  }, {
    "is_past": true,
    "title": "Market Analyst",
    "person": {
      "first_name": "Aravind",
      "last_name": "Natarajan",
      "permalink": "aravind-natarajan"
    }
  }, {
    "is_past": true,
    "title": "Director of Product Management",
    "person": {
      "first_name": "Hyther",
      "last_name": "Nizam",
      "permalink": "hyther-nizam"
    }
  }, {
    "is_past": true,
    "title": "Western Regional OEM Sales Manager",
    "person": {
      "first_name": "Ian",
      "last_name": "Wenig",
      "permalink": "ian-wenig"
    }
  }],
  "competitions": [],
  "providerships": [{
    "title": "DHFH",
    "is_past": true,
    "provider": {
      "name": "A Small Orange",
      "permalink": "a-small-orange"
    }
  }],
  "total_money_raised": "$0",
  "funding_rounds": [],
  "investments": [],
  "acquisition": null,
  "acquisitions": [],
  "offices": [{
    "description": "Headquarters",
    "address1": "4900 Hopyard Rd.",
    "address2": "Suite 310",
    "zip_code": "94588",
    "city": "Pleasanton",
    "state_code": "CA",
    "country_code": "USA",
    "latitude": 37.692934,
    "longitude": -121.904945
  }],
  "milestones": [],
  "video_embeds": [],
  "screenshots": [{
    "available_sizes": [
      [
        [
          150,
          94
        ],
        "assets/images/resized/0004/3400/43400v1
-max-150x150.png"
      ],
      [
        [
          250,
          156
        ],
        "assets/images/resized/0004/3400/43400v1
-max-250x250.png"
      ],
      [
        [
          450,
          282
        ],
        "assets/images/resized/0004/3400/43400v1
-max-450x450.png"
      ]
    ],
    "attribution": null
  }],
  "external_links": [],
  "partners": []
} >
&#13;
&#13;
&#13;

针对我们的node.js应用

的以下查询
db.companies.aggregate([{
  $match: {
    "name": "Facebook"
  },
$project: {
        "_id": 0,
        "name": 1,
        "people": "$relationships.person.last_name"
    }
}])

给出以下错误:

  

断言:命令失败:{           &#34; OK&#34; :0,           &#34; ERRMSG&#34; :&#34;管道阶段规范对象必须包含正确的字段。&#34;,           &#34;代码&#34; :16435}:聚合失败   _getErrorWithCode@src/mongo/shell/utils.js:25:13 doassert@src/mongo/shell/assert.js:13:14   assert.commandWorked@src/mongo/shell/assert.js:267:5   DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1312:5   @(壳):1:1

     

2016-09-17T19:20:26.303 + 0530 E QUERY [thread1]错误:命令   失败了:{           &#34; OK&#34; :0,           &#34; ERRMSG&#34; :&#34;管道阶段规范对象必须包含正确的字段。&#34;,           &#34;代码&#34; :16435}:聚合失败:   _getErrorWithCode@src/mongo/shell/utils.js:25:13 doassert@src/mongo/shell/assert.js:13:14   assert.commandWorked@src/mongo/shell/assert.js:267:5   DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1312:5   @(壳):1:1

我无法找出原因?

1 个答案:

答案 0 :(得分:1)

您缺少聚合管道运营商的一些大括号。正确的管道应该是:

db.companies.aggregate([
    { "$match": {  "name": "Facebook" } }, /* match pipeline stage */
    { "$project": { /* project pipeline stage */
        "_id": 0,
        "name": 1,
        "people": "$relationships.person.last_name"
    } }
])