以下代码段显示了三个查询:
<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"
答案 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
运算符要考虑的内容,因此不会报告这样的数组实际上是一个数组。