Mongo搜索最后插入的项目

时间:2014-06-11 15:29:15

标签: mongodb

我有这样的文件结构

{
  _id: 1,
  userId: 10,
  tags:   ['a', 'b', 'c'],
  created: '2014-06-01'
},

{
  _id: 2,
  userId: 10,
  tags:   [],
  created: '2014-06-05'
}

{
  _id: 3,
  userId: 11,
  tags:   ['a', 'b', 'c'],
  created: '2014-05-29'
}

我想得到这样的结果(按标签搜索)(仅按最后插入的项目搜索)。如果最后插入的项目没有标记,则不应显示为

的结果
{
    _id: 3,
   userId: 11,
   tags:   ['a', 'b', 'c'],
   created: '2014-06-02'
}

所以,我试着用下一个查询

来做
db.users.find({tags: 'a'}).sort({created: -1})

,结果看起来像这样

{
   _id: 3,
   userId: 11,
   tags:   ['a', 'b', 'c'],
   created: '2014-06-02'
}

{
  _id: 1,
  userId: 10,
  tags:   ['a', 'b', 'c'],
  created: '2014-06-01'
}

但结果不是我预期的结果......因为最后一项没有任何标签

2 个答案:

答案 0 :(得分:1)

因此,如果我理解正确,您希望在标签数组中搜索特定标签的存在,但只根据“已创建”在最后一个文档中进行搜索。

所以你需要做两件事:

  1. 修复“已创建”字段。它存储为字符串,不会这样做, 因为你不能轻易比较存储为字符串的日期,所以排序 不行。所以你需要解决这个问题。请查看 BSON日期类型的文档,也请查看文档 无论您使用何种语言/驱动程序。 http://docs.mongodb.org/manual/reference/bson-types/#document-bson-type-date
  2. 使用聚合框架。您可以使用聚合框架 执行此类分析。我在下面提供了示例代码, 假设您的示例模式已使用正确的日期进行了更正 格式:

    {   _id:1,   userId:10,   标签:['a','b','c'],   已创建:ISODate(“2014-06-01T10:50:42.389Z”) }

    {   _id:2,   userId:10,   标签:[],   创建:ISODate(“2014-06-05T12:30:48.389Z”) }

    {   _id:3,   userId:11,   标签:['a','b','c'],   已创建:ISODate(“2014-05-05T02:12:09.389Z”) }

  3. 然后,您可以运行以下聚合管道命令:

    db.collectionname.aggregate([
                         {$sort:{created:-1}}, 
                         {$limit:1}, 
                         {$match:{tags:"a"}}
                         ])
    

    这将匹配任何内容,因为创建的最后一个文档在tags数组中没有“a”。如果您随后添加新文档:

    {
      _id: 4,
      userId: 11,
      tags:   ['a', 'c'],
      created: ISODate("2014-06-09T02:12:09.389Z")
    }
    

    现在是最新创建的并且在标签中有“a”并运行此命令:

    { 
      "_id" : 4, 
      "userId" : 11, 
      "tags" : [ "a", "c" ], 
      "created" : ISODate("2014-06-09T02:12:09.389Z") 
    }
    

    我认为这是理想的结果。有关聚合框架的更多信息:

    http://docs.mongodb.org/manual/core/aggregation-introduction/

答案 1 :(得分:0)

这是因为字段created不是MongoDB中的有效日期类型字段。

您需要正确存储该字段中的值。一种方法是插入如下值:

created : ObjectId().getTimestamp()

现在created将拥有有效的MongoDB日期值。要按逆时间顺序对它们进行排序,你必须运行的是:

db.collection.find().sort({'created' : -1});

您可以在find()中添加内容以搜索特定文档。您确实在问题中搜索了标签。我已经跳过了它。你现在肯定有这个想法......