我正在使用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"
}
答案 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()
,那么一个结果就不难在那里操作。