Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-4633

Retrieve only the first matched object

    • Query
    • Fully Compatible

      This is a proposal for a new feature that makes it possible to limit a result to only one object.
      The limit is not applied via an standard sorting, but using a conditional operator with a list of parameters in decreasing priority.
      Conditional operators like $in and $or will return only the first matched object.
      The object can be a document or an array item.


      The use case: multilanguage documents with support for fallback to a default language.

      For this document:

      {
          "_id": 1,
          "author": "John",
          "languages": [
              {
                  "code": "en",
                  "data": {
                      "title": "Title",
                      "contents": "My text."
                  }
              },
              {
                  "code": "fr",
                  "data": {
                      "title": "Le titre",
                      "contents": "Mon texte."
                  }
              },
              {
                  "code": "it",
                  "data": {
                      "title": "Titolo",
                      "contents": "Il mio testo."
                  }
              }
          ]
      }
      

      I'd like to query conditionally for the user (website visitor) language, with a fallback to the default (app) language, but returning only one of them.
      For that, I'd propose the new conditional operators $inFirst and $orFirst. They would return only the first match, evaluated from the left to the right.
      I'll use $inFirst in the example below.

      Suppose user's language is 'fr' and app default language is 'it'.

      db.col.find( { _id:1, 'languages.code': { $inFirst: [ 'fr', 'it' ] } }, { author: 1, 'languages.$': 1 } )
      

      Please note that the query features a (hopefully) future feature specified in SERVER-828.

      Expected result:

      {
          "_id": 1,
          "author": "John",
          "languages": [
              {
                  "code": "fr",
                  "data": {
                      "title": "Le titre",
                      "contents": "Mon texte."
                  }
              }
          ]
      }
      

      I hope that this can be implemented without issues with indexes, parallel processing and sharded setups.

            Assignee:
            backlog-server-query Backlog - Query Team (Inactive)
            Reporter:
            mentel Rodrigo Coelho
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: