2014-02-27 2 views
0

У меня есть коллекция с этой структурой:MongoDB пользовательские полей с другим запросом

{ 
_id : <number>, 
param1 : <number>, 
param2 : <number>, 
param3 : <number>, 
. 
. 
. 
} 

Я хотел бы получить документы обратно, которые имеют право на условия и содержит дополнительный параметр массива с _id значениями тех, документы, которые имеют такое же значение в «param1», что и фактическая строка. Так что я бы результат, как этот:

{ 
_id : <number>, 
param1 : <number>, 
param2 : <number>, 
param3 : <number>, 
. 
. 
. 
extraParameter: [{_id: 1}, {_id: 5}, {_id: 7}, {_id: 10} ...] 
} 

я не уверен, если я могу это сделать, но надеюсь, что вы можете мне помочь найти лучшее решение для этого.

Спасибо!

Отредактировано:

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

db.collection.find().forEach(function(row){ 
    row.nexts = db.collection.find({param1: row.param1}).map(function(nextElement){ 
    return {_id: nextElement._id};}); 
    return row;} 
) 
+0

extraParameter означает значения из 'param1', 'param2' и т. Д. Или вы имеете в виду соответствие между документами. Измените пожалуйста, так как ваш вопрос не так понятен. –

+0

@Neil Я отредактировал ... это ясно, что я хочу достичь? – geri

ответ

0

Вы можете сделать что-то подобное с агрегацией:

db.coll.aggregate([{$group: {_id: "$param1", extras: {$push: "$_id"}}}]) 

Я подставила:

> db.coll.insert({'_id': 1, param1: 'a', b: 'b'}) 
> db.coll.insert({'_id': 2, param1: 'a', b: 'c'}) 
> db.coll.insert({'_id': 3, param1: 'a', b: 'd'}) 
> db.coll.insert({'_id': 4, param1: 'b', b: 'e'}) 

И это приводит к этому.

{ 
    "result" : [ 
     { 
      "_id" : "b", 
      "extras" : [ 
       4 
      ] 
     }, 
     { 
      "_id" : "a", 
      "extras" : [ 
       1, 
       2, 
       3 
      ] 
     } 
    ], 
    "ok" : 1 
} 

Затем вы можете перебирать каждый документ, а просто искать значение в массиве, который соответствует вашему _id значение param1.

+0

Спасибо за ваш ответ, но это не то, что я ищу. В вашем коде есть группа по параметру 1, которая делает только столько строк результата, сколько имеет значение параметра param1. Я хочу вернуть все строки (!), И каждый из них должен быть параметром «extras», который содержит по крайней мере параметр _id тех строк, которые имеют такое же значение param1, что и фактическая строка. – geri

+0

geri, да, я не думаю, что вы можете делать то, что хотите за один проход. Я думаю, вам нужно сгенерировать дополнительные параметры для определенного значения param1, в первый проход - с сохранением их в dict. Затем во втором проходе пройдите через каждый документ, найдите соответствующую запись в dict и обновите документ с помощью дополнительных функций. – idbentley

+0

Я не был уверен, возможно ли это или нет. Спасибо за ваше предложение. – geri

Смежные вопросы