按字段值查询,而不是字段数组中的值

时间:2017-07-20 02:09:48

标签: mongodb mongodb-query

以下代码段显示了三个查询:

  • 找到所有文件
  • 找到包含字段<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.css" rel="stylesheet" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.js"></script> The img tag within div.image-block is used for background. User will put images on .block3 by drag and drop. How to create an element that will contain all elements from .image-block? <div class="image-block"> <div class="block3"></div> <div id="copyFromImageBlock"></div> </div> <div id="chooseImages"></div>的文档,其中包含字符串a或包含字符串"x"的数组
  • 找到包含字段"x"的文档,其中包含包含字符串a
  • 的数组

我无法找到包含字段"x"的文档,其中包含字符串a,而不是在数组中。

"x"

1 个答案:

答案 0 :(得分:1)

MongoDB基本上不关心某个&#34;给定路径的数据&#34;实际上是否在数组中。如果你想区分,那么你需要告诉它&#34;:

db.stuff.find({ "a": "x", "$where": "return !Array.isArray(this.a)" })

这就是$where增加了讨价还价的地方,在那里你可以提供明确要求的条件&#34;这是一个数组&#34;在JavaScript评估中通过Array.isArray()。并且JavaScript NOT !断言颠倒了逻辑。

另一种方法是添加$exists支票:

db.stuff.find({ "a": "x", "a.0": { "$exists": false } })

这也基本上要求&#34;这是一个阵列&#34;通过寻找第一个元素索引。所以&#34;反向&#34; false案例意味着&#34;这不是数组&#34;。

或者即使你注意到你可以使用$elemMatch来仅选择数组,但是&#34;否定&#34;使用$not

db.stuff.find({ "a": { "$not": { "$elemMatch": { "$eq": "x" } } } })

虽然可能&#34;不是&#34;最好的选择,因为那也&#34;否定索引使用&#34;,其他例子都努力避免至少包括&#34;一个&#34;匹配的积极条件。因此,最好包含&#34;隐含AND&#34;通过组合参数:

db.stuff.find({
  "a": { "$eq": "x", "$not": { "$elemMatch": { "$eq": "x" } } } 
})

或者&#34;聚合&#34;如果您的MongoDB版本(3.2或更高版本)不支持$where,则可以使用$isArray聚合运算符进行测试:

db.stuff.aggregate([
  { "$match": { "a": "x" } },
  { "$redact": {
    "$cond": {
      "if": { "$not": { "$isArray": "$a" } },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }}
])

注意提供&#34;常规&#34;是一种好习惯。查询条件以及可能的情况,以及所有情况。

  

同时注意到查询BSON $type在这种情况下通常不起作用,因为&#34;内容&#34;数组本身实际上是一个&#34;字符串&#34;,这是$type运算符要考虑的内容,因此不会报告这样的数组实际上是一个数组。