2014-03-17 1 views
1

Как достичь ниже SQL в MongoShell?MongoDB выбрать все где значение поля в списке запросов

Select TableA.* from TableA where TableA.FieldB in (select TableB.FieldValue from TableB) 

Монго документ дает некоторый пример

db.inventory.find({ qty: { $in: [ 5, 15 ] } }) 

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

Продление моего вопрос

У меня есть коллекция bot имен

боты коллекции

{ 
    "_id" : ObjectId("53266697c294991f57c36e42"), 
    "name" : "teoma" 
} 

У меня есть коллекция пользовательского трафика, в этой коллекции трафика, у меня есть a Поле useragent

userTraffic Коллекция

{ 
    "_id" : ObjectId("5325ee6efb91c0161cbe7b2c"), 
    "hosttype" : "http", 
    "useragent" : "Mediapartners-Google", 
    "is_crawler" : false, 
    "City" : "Mountain View", 
    "State" : "CA", 
    "Country" : "United States" 
} 

Я хочу, чтобы выбрать все документы трафика пользователя, где его useragent содержит любое имя bot коллекции

Это то, что я пришел с

var botArray = db.bots.find({},{name:1, _id:0}).toArray() 

db.Sessions.find({ 
    useragent: {$in: botArray} 
    },{ 
     ipaddress:1 
     }) 

Здесь я считаю, что это делает равно сравнению, но я хочу это сделать как сравнение %%

После того, как я получаю результат, я хочу сделать обновление для этого набора результатов в виде is_crawler = истина

Пытались что-то подобное, не полезно

db.bots.find().forEach(function(myBot) { 
    db.Sessions.find({ 
     useragent: /myBot.name/ 
     },{ 
      ipaddress:1 
      }) 
    }); 

Другой способ прокрутки записей, но совпадения не найдено.

var bots = db.bots.find({ 
    $query: {}, 
    $orderby:{ 
     name:1} 
     }); 
while(bots.hasNext()) { 
    var bot = bots.next(); 
    //print(bot.name); 
    var botName = bot.name.toLowerCase(); 
    print(botName); 
    db.Sessions.find({ 
     useragent: /botName/, 
     is_crawler:false 
     },{ 
      start_date:1, 
      ipaddress:1, 
      useragent:1, 
      City:1, 
      State:1, 
      Country:1, 
      is_crawler:1, 
      _id:0 
     }) 
    } 

ответ

0

Наконец-то я смог это выполнить.

// Get a array with values for name field 
var botArray = db.bots.find({},{name:1}).toArray(); 

// loop through another collection 
     db.Sessions.find().forEach(function(sess){ 
      if(sess.is_crawler == false){ // check a condition 
       // loop in the above array 
       botArray.forEach(function(b){ 
       //check if exists in the array 
        if(String(sess.useragent).toUpperCase().indexOf(b.name.toUpperCase()) > -1){ 
         db.Sessions.update({ _id : sess._id} // find by _id 
         ,{ 
          is_crawler : true // set a update value 
          }, 
          { 
           upsert:false // do update only 
          }) 
        } 
        }); 
      } 
     }); 
5

Не в одном запросе это не так.

Нет ничего плохого в том, чтобы получать результаты запроса и подавать его в качестве вашего условия.

var list = db.collectionA.find({},{ "_id": 0, "field": 1 }).toArray(); 

results = db.collectionB.find({ "newfield": { "$in": list } }); 

Но фактическая цель не ясна, так как с помощью запросов SQL самостоятельно как единственный пример того, что вы хотите для достижения, как правило, не хороший гид, чтобы ответить на этот вопрос. Основная причина этого заключается в том, что вы, вероятно, должны моделировать иначе, чем в реляционной. В противном случае, зачем вообще использовать MongoDB?

Предлагаю ознакомиться с разделом документации по Data Modelling, который показывает несколько примеров подхода к общим случаям моделирования.

Учитывая эту информацию, возможно, вы можете пересмотреть то, что вы моделируете, и если у вас тогда есть конкретные вопросы к другим проблемам, вы можете задать здесь свои вопросы.

+0

Как добиться же с подобным заявлением «Newfield»: { «$ как»: * список *} – HaBo

+0

Extended мой вопрос, увидеть, если это имеет смысл в Монго моделирования – HaBo

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

  • Нет связанных вопросов^_^