1

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 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?

killermonkeys
  • 445
  • 1
  • 5
  • 6

2 Answers2

1

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.

RameshVel
  • 64,778
  • 30
  • 169
  • 213
0

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

Thánh Ma
  • 133
  • 1
  • 8