我有这样的文件结构
{
_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'
}
但结果不是我预期的结果......因为最后一项没有任何标签
答案 0 :(得分:1)
因此,如果我理解正确,您希望在标签数组中搜索特定标签的存在,但只根据“已创建”在最后一个文档中进行搜索。
所以你需要做两件事:
使用聚合框架。您可以使用聚合框架 执行此类分析。我在下面提供了示例代码, 假设您的示例模式已使用正确的日期进行了更正 格式:
{ _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”) }
然后,您可以运行以下聚合管道命令:
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()中添加内容以搜索特定文档。您确实在问题中搜索了标签。我已经跳过了它。你现在肯定有这个想法......