Как я могу найти документы в MongoDb по количеству совпадающих объектов в массиве - PullRequest
2 голосов
/ 11 февраля 2012

Если у меня есть следующие 3 документа.Как выбрать документы, имеющие как минимум два фиолетовых квадрата.В этом случае это будет только последний элемент.

Я знаю, что могу выбрать документы с любыми фиолетовыми квадратами с db.foo.find({foo: {"$elemMatch": {shape: "square", color: "purple"}}})

Но есть ли способ сказать, что он должен соответствовать определенному числураз?

// Document 1
{ "foo" : [
      {
        "shape" : "square",
        "color" : "purple",
        "thick" : false
      },
      {
        "shape" : "circle",
        "color" : "red",
        "thick" : true
      }
] }


// Document 2
{ "foo" : [
      {
        "shape" : "square",
        "color" : "red",
        "thick" : true
      },
      {
        "shape" : "circle",
        "color" : "purple",
        "thick" : false
      }
] }

// Document 3
{ "foo" : [
      {
        "shape" : "square",
        "color" : "purple",
        "thick" : false
      },
      {
        "shape" : "square",
        "color" : "purple",
        "thick" : true
      }
] }

Этот пример адаптирован из последнего примера здесь: http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Этого можно достичь, используя $ where, MapReduce, или ваше приложение может увеличить количество интересных объектов при вставке / обновлении (например, db.foo.insert({foo:[{...}, {...}, ...], purpleSquareCount:2});).

Самое простое решение, вероятно, будет использовать $, где (обратите внимание на влияние на производительность):

hasPurpleSquares = function () {
    var count = 0;
    this.foo.forEach(function (obj) {
         if (obj.shape == "square" && obj.color == "purple") { 
              count = count + 1;
         }
    });
    if (count >= 2) {
        return true;
    }
}

db.foo.find({$where:hasPurpleSquares});
0 голосов
/ 11 февраля 2012

Только через $, где

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...