【问题标题】:MongoDB query to limit values based on conditionMongoDB查询根据条件限制值
【发布时间】:2011-06-18 05:28:02
【问题描述】:

我有一个这样的收藏:

{ "_id" : ObjectId("4d45bd25957a15b80702d4e4"), "codenum" : 10, "payment" : [
 {
  "pcode" : 100,
  "amount" : 10000
 },
 {
  "pcode" : 101,
  "amount" : 6000
 }
], "age" : 70 }

请注意,支付数组嵌入在此集合中。现在,我想在查找响应中仅检索匹配 101 的付款代码。

给出这样的查询:

db.test.find({"codenum":10, "payment.pcode": 101}, 
             {"codenum":1, "payment.pcode":1, "payment.amount":1})

将获得我的整个文档,包括其他支付代码,如上图所示。

但是,我需要这样的回复:

{ "_id" : ObjectId("4d45bd25957a15b80702d4e4"), "codenum" : 10, "payment" : [
 {
  "pcode" : 101,
  "amount" : 6000
 }
] }

在 mongodb 中可以吗?

在update()中有一个位置匹配,可以像“payment.$.amount”一样根据条件设置匹配字段。

可能MongoDB可以支持这样的查询:

db.test.find({"codenum":10, "payment.pcode": 101}, 
             {"payment.$.pcode": 1, "payment.$.amount":1})

然后将只给出符合给定条件的条目。

有什么想法吗?

【问题讨论】:

    标签: arrays mongodb


    【解决方案1】:

    据我所知,不可能从 MongoDB 的数组中只选择一个条目。您可以只返回文档中的某些字段(即您的支付数组),但您不能只返回基于查询的数组的一部分。 (您可以使用 $slice 返回特定的索引分隔元素,但这并不能满足您的需要)。

    您必须查询所有字段,或者不查询。 This JIRA ticket 描述了该问题,目前“已计划但未计划”。

    目前,您只需在应用程序代码中提取文档的相关部分即可。

    【讨论】:

    • 谢谢。当我浏览时,我注意到jira.mongodb.org/browse/SERVER-828 正是我的想法。希望虚拟收藏(SERVER-142,您提到的 JIRA 票证)将很快可用。我会接受你的回答。
    【解决方案2】:

    即使它仍在开发中,它也会为您提供所需的东西。 http://www.mongodb.org/display/DOCS/Aggregation+Framework

    【讨论】:

    • 我确实浏览了该 URL 中的文档,但我没有找到任何方法来单独从数组字段中选择匹配元素。
    • 你需要做的是 $unwind 数组字段。然后您可以只使用 $match 运算符来过滤结果。过滤结果后,您可以 $project 并且您应该拥有您正在寻找的记录集。
    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 2019-08-02
    相关资源
    最近更新 更多