当前位置: 首页 > 知识库问答 >
问题:

使用Pipeline进行MongoDB聚合查找不起作用

宗政兴发
2023-03-14

我有两个集合。如果集合2中的1号和2号在集合1中指定的一定范围内,我正在尝试将集合2的文档添加到集合1中。集合1中的FYI ObjectId和集合2中的ObjectId指的是两个不同的项目/产品,因此我无法在此id上加入两个集合。

集合1中的示例文档:

{'_id': ObjectId('4321'),
 'number1_lb': 61.205672407820025,
 'number1_ub': 61.24170844385606,
 'number2_lb': -149.75074963516136,
 'number2_ub': -149.71471359912533}

集合2中的示例文档:

{'_id': ObjectId('1234'),
  'number1': 1.282298,
  'number2': 103.8475}

我想要输出:

{'_id': ObjectId('4321'),
 'number1_lb': 61.205672407820025,
 'number1_ub': 61.24170844385606,
 'number2_lb': -149.75074963516136,
 'number2_ub': -149.71471359912533,
 'recs': [ObjectId('3456'), ObjectId('4567'),...]

我认为使用管道的查找阶段可以工作。我的代码当前如下:

 {"$lookup":{
        "from": "Collection 2",
        "let":{
            "number1_lb":"$number1_lb",
            "number1_ub":"$number1_ub",
            "number2_lb":"$number2_lb",
            "number2_ub":"$number2_ub"
        },
        "pipeline": [
            {"$match":
             {"$expr":
              {"$and":[
                  {"$gte":["$number1","$$number1_lb"]},
                  {"$gte":["$number2","$$number2_lb"]},
                  {"$lte":["$number1","$$number1_ub"]},
                  {"$lte":["$number2","$$number2_ub"]}
              ]}}}
        ],
        "as": "recs"
    }}

但是运行上面的没有给我输出。我做错了什么吗??

共有2个答案

梅欣然
2023-03-14

您希望使用查找$和项目:

   {
        $lookup: {
            from: "Collection2",
            localField: [Foreign Field of the Collection1],
            foreignField: [Principal field of the foreign collection here Collection2],
            as: "nameJoint"
            }
    },
    {$project: {

        "newFieldName": 
    }},

但要在两个文件之间建立一个连接,这两个文件之间就有一个公共字段。我不确定在这种情况下是否有这样一个问题,或者我误解了它。

(一个$lookup基本上是noSQL中的一个SQL关节)

段坚
2023-03-14

我运行它,它似乎工作得很好;但我不得不在coll1中调整您的输入数据,因为它不符合标准。

from pymongo import MongoClient
from bson.json_util import dumps

db = MongoClient()["testdatabase"]
# Data Setup
db.coll1.replace_one({"_id": "4321"}, {"_id": "4321", "number1_lb": -61.205672407820025, "number1_ub": 61.24170844385606, "number2_lb": -149.75074963516136, "number2_ub": 149.71471359912533}, upsert=True)
db.coll2.replace_one({"_id": "1234"}, {"_id": "1234", "number1": 1.282298, "number2": 103.8475}, upsert=True)
# Run the aggregation
results = db.coll1.aggregate([
    {"$lookup": {
        "from": "coll2",
        "let": {
            "number1_lb": "$number1_lb",
            "number1_ub": "$number1_ub",
            "number2_lb": "$number2_lb",
            "number2_ub": "$number2_ub"
        },
        "pipeline": [
            {"$match":
                {"$expr":
                    {"$and": [
                        {"$gte": ["$number1", "$$number1_lb"]},
                        {"$gte": ["$number2", "$$number2_lb"]},
                        {"$lte": ["$number1", "$$number1_ub"]},
                        {"$lte": ["$number2", "$$number2_ub"]}
                    ]}}}
        ],
        "as": "recs"
    }}
])
# pretty up the results
print(dumps(results, indent=4))

给出:

[
    {
        "_id": "4321",
        "number1_lb": -61.205672407820025,
        "number1_ub": 61.24170844385606,
        "number2_lb": -149.75074963516136,
        "number2_ub": 149.71471359912533,
        "recs": [
            {
                "_id": "1234",
                "number1": 1.282298,
                "number2": 103.8475
            }
        ]
    }
]
 类似资料:
  • 我将如何在Spring靴中使用? 我需要一个“yildiz”平均值。 我的收藏 avg_yildiz MongoDBConfig。Java语言 MongoDB配置类。如何添加mongoTemplate? 编辑 Java语言lang.IllegalArgumentException:不支持的实体com。应用领域八一!无法确定IsNewStrategy。 如何保存存储库?

  • 我已经在机器A中安装了IBM MQ server v9,在这个MQ服务器中,通过MQ Explorer,我定义了队列管理器和一些队列。我希望通过JNDI从运行在另一台机器B上的客户端查找这个队列管理器及其队列。 因此,通过MQ Explorer,我尝试在“JMS Administed Objects”中添加初始上下文,对于所定位的JNDI命名空间,我不想使用LDAP服务器或文件系统,我选择“Oth

  • 但在我看来不对。有人能建议别的方法做这件事吗。

  • 我有包含以下模式的文档的集合。我想过滤/查找所有包含性别女性的文档并汇总大脑评分的总和。我尝试了下面的语句,它显示了无效的管道错误。 架构:

  • 我需要使用spring数据过滤mongodb中的文档,该数据包含nexted数组。我在mongo shell上使用以下聚合查询,它运行良好。但当我通过springdata聚合操作触发该操作时,我得到的是空响应。mongo查询的工作原理是: 我正在使用但不工作的Spring数据代码: 我尝试打破这个聚合函数,它能够项目rssSearchResponse.journeys但$unWind后,它返回空结

  • 我使用Nodejs和MongoDB与expressjs和mongoose库,创建一个具有用户、文章和评论模式的博客API。下面是我使用的模式。