Mongodb: Querying array elements within a document
I have a collection I'd like to query as follows:
- return all documents
- up to 2 comments (e.g. a slice, either 0, 1, or 2 comments)
- all comments must have views > 10
It seems like I need to create a function to evaluate each document individually, but it's 开发者_StackOverflow社区not clear how that's done, particularly given I want to do a slice and return up to n items matching that criteria.
Sample schema:
{
title: "One",
comments: [
{
title: "comment1",
views: 9
},
{
title: "comment2",
views: 10
},
{
title: "comment3",
views: 11
},
{
title: "comment4",
views: 12
},
]
}
I want to do something like:
db.collection.find({"comments.views": {$gt: 10}}, {comments:{$slice: 2}})
But this returns any document with a comment with > 10 views, and then slices 2 comments... I want to return on those comments which have > 10 items. I cannot do it on the client AND use $slice without losing some comments, so I need to do it on the DB. Thoughts?
But this returns any document with a comment with > 10 views, and then slices 2 comments
This is the behavior of filtering multi level embedded document, normally the matching filter would return the whole document, not the subsets.
Usually positional operator $ used to match the sub documents in updates. But the feature is not yet implemented in return specifiers.
There is an outstanding issue already in mongo Support for positional ($) operator in fields to return specifier. (Please login to vote if you really needed the feature)
So you have to handle the
- up to 2 comments (e.g. a slice, either 0, 1, or 2 comments)
part in your application by loop through all collections.
you could take a look at aggregation. You have to $unwind it first, then apply the filter:
db.<your collection>.aggregate( [ { $unwind : "$comments" },
{$match:{"comments.views": {$gt: 10}}} ] )
Check the results and apply other operation on that
精彩评论