当前位置:  开发笔记 > 编程语言 > 正文

MongoDB选择查询列表中的所有where字段值

如何解决《MongoDB选择查询列表中的所有where字段值》经验,为你挑选了1个好方法。

如何在MongoShell中实现以下SQL?

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

Mongo doc给出了一些例子

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

我希望该数组是从另一个查询动态的.可能吗?

扩展我的问题

我有一个bot名字的集合

机器人收藏

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

我有一个用户流量的集合,在该流量集合中,我有一个字段 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 = true

试过这样的事情,没有用

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
        })
    }

Neil Lunn.. 6

不在单个查询中它不是.

从查询中获取结果并将其作为您的状态进行输入没有任何问题.

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

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

但是你的实际目的并不清楚,因为单独使用SQL查询作为你想要实现的唯一例子通常不是回答这个问题的好指南.造成这种情况的主要原因是,您可能应该采用与关系相同的方式进行建模.否则,为什么要使用MongoDB呢?

我建议阅读有关数据建模的文档部分,其中显示了如何处理常见建模案例的几个示例.

考虑到这些信息,那么也许您可以重新考虑一下您的建模,如果您对那里的其他问题有特定的问题,那么请随时在这里提出您的问题.



1> Neil Lunn..:

不在单个查询中它不是.

从查询中获取结果并将其作为您的状态进行输入没有任何问题.

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

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

但是你的实际目的并不清楚,因为单独使用SQL查询作为你想要实现的唯一例子通常不是回答这个问题的好指南.造成这种情况的主要原因是,您可能应该采用与关系相同的方式进行建模.否则,为什么要使用MongoDB呢?

我建议阅读有关数据建模的文档部分,其中显示了如何处理常见建模案例的几个示例.

考虑到这些信息,那么也许您可以重新考虑一下您的建模,如果您对那里的其他问题有特定的问题,那么请随时在这里提出您的问题.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有