Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mongoose中如何排序内部数组和匹配元素_Javascript_Node.js_Mongodb_Coffeescript_Mongoose - Fatal编程技术网

Javascript mongoose中如何排序内部数组和匹配元素

Javascript mongoose中如何排序内部数组和匹配元素,javascript,node.js,mongodb,coffeescript,mongoose,Javascript,Node.js,Mongodb,Coffeescript,Mongoose,所以我尝试在mongoose中进行一个半复杂的查询。详情如下: Event.findOne({ users: { $elemMatch: { user: someUserId, going: 1 }, sort: {createTime: -1} } } 基本上,我想做的是找到一个事件,该事件的用户数组中有一个与Id匹配且正在参与的用户。对于用户数组中的每个用户,我都有多个用户记录,因此我希望找到最近的一个,为此,我希望按createTime对用户数组进行排序。这就是错误出现的地方,它只返回u

所以我尝试在mongoose中进行一个半复杂的查询。详情如下:

Event.findOne({ users: { $elemMatch: { user: someUserId, going: 1 }, sort: {createTime: -1} } }
基本上,我想做的是找到一个事件,该事件的用户数组中有一个与Id匹配且正在参与的用户。对于用户数组中的每个用户,我都有多个用户记录,因此我希望找到最近的一个,为此,我希望按createTime对用户数组进行排序。这就是错误出现的地方,它只返回
undefined
。当我不包含sort函数时,它可以正常工作,有没有办法包含它

以下是我的事件对象的外观:

{ 
  _id: 1,
  endTime: 1429060173865,
  createTime: 1429051773902,
  startTime: 1429052973865,
  description: 'some desc',
  creator: 2,
  users:
   [ { user: 1,
       status: 1,
       going: 1,
       createTime: 1429051773749,
       _id: 552d997d8e923847306e2c21 },
     { user: 1,
       status: 1,
       going: 1,
       createTime: 1429051773922,
       _id: 552d997d8e923847306e2c25 },
     { user: 1,
       status: 9,
       going: 0,
       createTime: 1429051773942,
       _id: 552d997d8e923847306e2c26 } ],
  destroyed: 0 }

有没有办法完全在mongoose中进行此查询?

您的查询编写不正确。为了进行排序,您应该将其写在find的第三个参数中:

Event.findOne(
     { users: 
           { $elemMatch: { user: someUserId, going: 1 }}
     },
     null,
     { 
         sort: {createTime: -1} 
     },
     function(err, event) {
         //your event here
     });

作为find的一部分,MongoDB不能对文档的数组字段进行排序。您可以定义Mongoose的虚拟数组,以按排序顺序返回数组。您还可以按排序顺序维护数组,如下所示:

> db.test.drop()
// note: not in order when inserted
> db.test.insert({ "_id" : 0, "users" : [
    { "user" : 1, "going" : 1, "created" : 22 },
    { "user" : 2, "going" : 1, "created" : 775 },
    { "user" : 1, "going" : 1, "created" : 6432 }
] })
// insert user to array and sort as part of update
> db.test.update({ "_id" : 0 },
    { "$push" : { 
        "users" : {
            "$each" : [{ "user" : 2, "going" : 1, "created" : 5532 }],
            "$sort" : { "created" : -1 }
        }
    } })
> > db.test.findOne()
{
    "_id" : 0,
    "users" : [
        { "user" : 1, "going" : 1, "created" : 6432 },
        { "user" : 2, "going" : 1, "created" : 5532 },
        { "user" : 2, "going" : 1, "created" : 775 },
        { "user" : 1, "going" : 1, "created" : 22 }
    ]
}

这样,当您执行查找查询时,匹配文档中的数组将已处于所需的顺序。

如果您使用对另一个集合的引用,则可以使用“填充”函数并在数组中对结果进行排序/限制。但是,看起来您正在使用一个子文档,它不支持您试图执行的操作。唯一的选择是手动处理每个文档。看起来您的语法已关闭。尝试正确地关闭括号和大括号:
Event.findOne({users:{$elemMatch:{user:someUserId,go:1}}})。sort({createTime:-1})
OP希望对每个匹配文档中的数组进行排序,而不是对匹配文档进行排序。我认为您不能直接进行排序,使用聚合时可能会这样做。