mongodb $ elemMatch - PullRequest
       3

mongodb $ elemMatch

2 голосов
/ 09 февраля 2012

В соответствии с mongodb doc, синтаксис для $ elemMatch будет,

t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } )

Я пытался, и он отлично работает. Вышеуказанное означает, что он может найти, существует ли объект {a: 1, b: 'больше чем 1'} в массиве x.

У меня есть требование, где мне нужно выяснить, существуют ли все объекты в массиве в базе данных или нет.

например, допустим, у меня есть массив,

a=[{a:1, b:2},{a:3, b:4}, {a:5, b:6}]

и мне нужно выяснить, содержит ли x все из них.

t.find ({x: {$ elemMatch: {a: {$ all: [1]}, b: {$ all: [2]}}}}), и он находит все x, содержащие {a: 1, б: 2}

Но если я попытаюсь, t.find( { x : { $elemMatch : { a : {$all:[1,3]}, b : {$all:[2,4]} } } } ), это не получится. Я знаю, что это не правильно. Есть ли способ, которым я могу достичь этого? Идеалт, должно быть,

t.find( { x : { $elemMatch : {$all:[ {a:1, b:2}, {a:3, b:4}] } } )

Я пытался, это не работает.

Ответы [ 3 ]

1 голос
/ 09 февраля 2012
t.find({$and:[{a:{$elemMatch:{a:1, b:2}}}, {a:{$elemMatch:{a:3, b:4}}}, {a:{$elemMatch:{a:5, b:6}}}]})

Это не особенно высокопроизводительный вариант.

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

Вы не можете использовать elemMatch для этого, но вы можете просто создать запрос, который проверяет, соответствует ли a всему массиву:

db.items.insert({ 'foo' : 1, 'a' :  [{a:1, b:2},{a:3, b:4}, {a:5, b:6}]});
db.items.insert({ 'foo' : 1, 'a' :  [{a:1, b:2},{a:3, b:4}, {a:8, b:7}]});
db.items.find({'a': [{a:1, b:2},{a:3, b:4}, {a:8, b:7}]});

{ "_id" : ObjectId("4f3391856e196eca5eaa7518"), "foo" : 1, "a" : [ { "a" : 1, "b" : 2 }, { "a" : 3, "b" : 4 }, { "a" : 8, "b" : 7 } ] }

Однако, чтобы это работало, порядок элементов в массиве должен быть одинаковым для документа и запроса. Следующие ничего не найдут:

db.items.find({'a': [{a:3, b:4},{a:1, b:2}, {a:8, b:7}]});

(поскольку {a: 3, b: 4} и {a: 1, b: 2} поменяны местами).

0 голосов
/ 21 октября 2013

Как насчет этого:

db.items.find({x : { $all: [
  {$elemMatch: {a: 1, b: 2}}, 
  {$elemMatch: {a: 3, b: 4}}, 
  {$elemMatch: {a: 5, b: 6}}
    ]}}

Проверьте Монго документы .

Также обратите внимание на предупреждение о документах:

В текущем выпуске запросы, использующие оператор $ all, должны проверяться все документы, которые соответствуют первому элементу в массиве запросов. Как В результате даже при наличии индекса для поддержки запроса операция может быть долгим, особенно когда первый элемент в массиве не очень избирательно.

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