我有以下users
集合:
{
"_id" : ObjectId("5b29ba37cd0b1726068731c3"),
"name" : "Gym Dog",
"profilePicUrl" : "https://i.imgur.com/mPStaKV.png",
"totalProgress" : {
"goal" : 300,
"progress" : 0,
"percentage" : 0
},
"goals" : [
{
"description" : "Running",
"goal" : 100,
"progress" : 0,
"percentage" : 0
},
{
"description" : "Lifting",
"goal" : 200,
"progress" : 0,
"percentage" : 0
}
],
"days" : [
{
"weekday" : "Sunday",
"content" : ""
},
{
"weekday" : "Monday",
"content" : ""
},
{
"weekday" : "Tuesday",
"content" : ""
},
{
"weekday" : "Wednesday",
"content" : ""
},
{
"weekday" : "Thursday",
"content" : ""
},
{
"weekday" : "Friday",
"content" : ""
},
{
"weekday" : "Saturday",
"content" : ""
}
],
"activities" : [ ]
}
我想选择用户goals
的{{1}}的第二个元素,然后将结果返回到NodeJS回调函数中。
以下是我在 Mongo shell 中所做的事情:
Gym Dog
来自Mongo Shell的结果。 这也是我期望NodeJS代码输出的结果
db.users.aggregate(
{ $match: { name: 'Gym Dog' }},
{ $project: {
_id: 0,
ithGoal: { $arrayElemAt: [ '$goals', 1 ] }
}}
).pretty()
以下是我在 NodeJs 中所做的事情:
{
"ithGoal" : {
"description" : "Lifting",
"goal" : 200,
"progress" : 0,
"percentage" : 0
}
}
但是,当mongoDB.collection('users').aggregate(
// pipeline
[
{ $match: { name: 'Gym Dog' }},
{ $project: {
_id: 0,
ithGoal: { $arrayElemAt: [ '$goals', 1 ] }
}}
],
// callback
function(err, result) {
if (err) {
throw err
}
console.log(result);
});
登录到控制台时,它是一个result
对象,带有一堆不相关的信息。它与Mongo shell的输出没有任何相似之处(我在这里不包括输出,因为它太长了。)
我也尝试过AggregationCursor {}
,但是它输出了整个mongoDB.collection('users').aggregate().toArray(function(err, result) {});
,name
,profilePicUrl
,totalProgress
,goals
, days
(换句话说,它从我给出的条件中什么也没选择)。
所以,我的问题是,如何在NodeJS中获取回调函数,以将与Mongo shell完全相同的结果存储到activitise
参数中?
我正在使用MongoDB社区3.6.5。预先感谢!
答案 0 :(得分:1)
语法似乎正确。请检查MongoDB连接URL。 但是我不确定,我想是与数据库连接有关的一些问题
答案 1 :(得分:0)
我也遇到了同样的问题,我通过验证查询中传递的 _id 是一个有效的 ObjectId 来解决它,您可以如下所示验证它。
import { ObjectId } from 'mongodb';
ObjectId.isValid(your_data_id) // Returns either true or false.