根据匹配条件在mongo中一次查询多个集合

时间:2019-11-03 13:37:45

标签: mongodb mongo-cxx-driver

我想编写聚合函数以一次调用选择整个集合中具有TCS的所有名称-

我怎么写才能在一个呼叫中获取所有具有TCS的名称?

    db.stocks.find()
    { "_id" : ObjectId("5d81e624ae6a505982c1c409"), "name" : "Infosys", "qty" : 100, "price" : 800 }
    { "_id" : ObjectId("5d81e624ae6a505982c1c40a"), "name" : "TCS", "qty" : 100, "price" : 2000 }
    { "_id" : ObjectId("5d81e624ae6a505982c1c40b"), "name" : "Wipro", "qty" : 2500, "price" : 300 }
    { "_id" : ObjectId("5dbea62c608aba164b7c869b"), "name" : "TCS", "qty" : 0, "price" : 800 }
    { "_id" : ObjectId("5dbea62c608aba164b7c869c"), "name" : "TCS", "qty" : 0, "price" : 2000 }
    db.stocks1.find()
    { "_id" : ObjectId("5d81e652ae6a505982c1c40c"), "name" : "Infosys_1", "qty" : 100, "price" : 800 }
    { "_id" : ObjectId("5d81e652ae6a505982c1c40d"), "name" : "TCS_1", "qty" : 100, "price" : 2000 }
    { "_id" : ObjectId("5d81e652ae6a505982c1c40e"), "name" : "Wipro_1", "qty" : 2500, "price" : 300 }
    { "_id" : ObjectId("5d81f013ae6a505982c1c40f"), "name" : "Infosys", "qty" : 200, "price" : 800 }
    { "_id" : ObjectId("5d81f013ae6a505982c1c410"), "name" : "TCS", "qty" : 200, "price" : 2000 }
    { "_id" : ObjectId("5d81f013ae6a505982c1c411"), "name" : "Wipro", "qty" : 3500, "price" : 300 }
    { "_id" : ObjectId("5dbea5dd608aba164b7c8698"), "name" : "TCS", "qty" : 0, "price" : 800 }
    { "_id" : ObjectId("5dbea5dd608aba164b7c8699"), "name" : "TCS", "qty" : 0, "price" : 2000 }
    { "_id" : ObjectId("5dbea5dd608aba164b7c869a"), "name" : "TCS", "qty" : 4500, "price" : 300 }
    db.stocks2.find()
    { "_id" : ObjectId("5d81f0ceae6a505982c1c412"), "name" : "Infosys", "qty" : 300, "price" : 800 }
    { "_id" : ObjectId("5d81f0ceae6a505982c1c413"), "name" : "TCS", "qty" : 300, "price" : 2000 }
    { "_id" : ObjectId("5d81f0ceae6a505982c1c414"), "name" : "Wipro", "qty" : 4500, "price" : 300 }

1 个答案:

答案 0 :(得分:0)

我认为这不可能

在mongo中,可用于查询一个集合中其他集合的唯一内容是 $lookup ,为此,您还需要一个引用键和相应集合中的推荐键 您的集合中没有这些 )。

即使在$ lookup阶段在localField和foreignField中提供伪密钥,当我们查询股票时,也会从stock1中获取数据,但是整个结果的结构将非常奇怪,并且仅当您尝试获取数据时才会变得更糟。库存2。您将需要大量重复的文档,并且必须进行大量的后处理才能过滤出结果并以正确的格式显示结果。

最好是分别查询并获取结果,这比进行大量后期处理要快。

或者您可以更改架构,并尝试添加键以引用一个集合中的另一个集合。

建议:

根据您在股票1,股票2中的数据,它们具有相同的字段

所以为什么不将它们本身合并为一个收藏集mainStocks

这样, mainStocks 拥有所有三只股票,stocks1,stocks2 AND 的所有停靠点,并且所有将要插入到stocks或stocks1中的新文档或股票2。

基本上,所有CRUD操作都应在对stock,stock1,stock2进行的mainStock上完成。