- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试在 mongo 上运行更新查询,这将在现有数组属性中添加一些值。
我的目标是在数组的开头添加元素,而不是在默认情况下发生在末尾。这是我正在使用的代码:
db.collection("Project").update({'_id': group.project}, {$addToSet: {'endpointOrder': {$each: group.endpointOrder, $position: 0}}}, {multi: true})
正如您在上面所看到的,如果我只是将“addToSet”更改为使用“push”修饰符,则可以正常工作,但这将保留重复项,但这是不可能的。所以,我的假设是,$position 仅支持 '$push',不支持 '$addToSet'。
关于如何实现该目标的任何想法/建议?谢谢。
最佳答案
$addToSet
运算符生成一组“独特”的项目,这很可能是您所追求的。不幸的是,对于这个和其他“集合运算符”,MongoDB 有一个共同的口头禅:
"Sets are not considered to be ordered"
因此,当您将项目添加到“集合”(或与其他操作组合)时,无法保证项目出现在任何位置,无论是“集合”的开头还是结尾。官方说法是,任何元素都可以以任何顺序出现,只要是“集合”的一部分就无所谓。
但还有另一种解决方法,它只是意味着您不使用 $addToSet
而是结合使用一些其他过滤逻辑和 $push
:
考虑文档:
{ "a": [ 3,1,2 ] }
因此,如果我想向列表中添加一个新元素 4
并将其添加到该元素尚未属于“集合”的“第一个”位置,那么您只需构造像这样查询和更新:
db.collection.update(
{ "a": { "$ne": 4 } },
{ "$push": { "a": { "$each": [4], "$position": 0 } } }
)
简而言之:“如果值已经存在于数组中,则不要推送到数组。”
事实上,仅此而已。如果您要求添加一个已经存在的元素,那么查询条件当然会是 false
,并且不会修改任何内容。
最后,您将获得与使用 $addToSet
操作相同的结果,除了您可以完全控制元素定位,甚至可以根据需要进行“排序”。您需要做的就是在决定是否更改任何内容之前检查匹配的元素。
处理多个元素的过程实际上应该使用“批量”操作 API 以获得最高效率
var items = [4,3];
var bulk = db.collection.initializeOrderedBulkOp();
bulk.find({ "a": { "$nin": items } }).updateOne(
{ "$push": { "a": { "$each": items, "$position": 0 } } }
);
items.forEach(function(item) {
bulk.find({ "a": { "$ne": item } }).updateOne(
{ "$push": { "a": { "$each": [item], "$position": 0 } } }
);
});
bulk.execute();
这将导致循环中只有一个更新操作实际匹配或修改任何内容:
{ "a": [ 4,3,1,2 ] }
或者使用根本不存在的值:
var items = [5,8];
var bulk = db.collection.initializeOrderedBulkOp();
bulk.find({ "a": { "$nin": items } }).updateOne(
{ "$push": { "a": { "$each": items, "$position": 0 } } }
);
items.forEach(function(item) {
bulk.find({ "a": { "$ne": item } }).updateOne(
{ "$push": { "a": { "$each": [item], "$position": 0 } } }
);
});
bulk.execute();
然后第一个操作实际上会修改并且循环指令将不会匹配任何内容,因为项目已经存在。
{ "a": [ 5,8,4,3,1,2 ] }
关于mongodb - 使用 $addToSet 修饰符在前面添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31276884/
我一直在尝试使用 node.js api 在 findAndModify 查询中使用 $addToSet。但是我收到一条错误消息,指出前缀字段 $addToSet 对存储无效。查询可以使用 mongo
我在数据库记录的实体中有一个对象数组。我想将新对象推送到该数组,但我不想多次推送同一个对象。我知道我可以使用$addToSet,但是问题出现在我添加时间戳的每个对象中,所以这个方法不区分对象已经在数组
我在一个文档中有一个(mongodb)嵌入文档列表,我有兴趣将一个新的嵌入文档添加到现有文档列表中。 据我研究,我可以使用 $addToSet,我不明白的是 MongoDB 如何决定新文档是否已存在于
$addToSet 好像只能添加到数组,是否可以将散列添加到散列? { "a"=>"1", "b"=>"2", "c"=>{"d"=>"3"} } 到 { "a"=>"
鉴于此示例文档: > db.sample.find().pretty() { "_id" : ObjectId("570f76ca4fe66c8ae29f13cd"), "a" : [
所以我希望我的收藏中的文档在结构上看起来像这样: { "_id": "123", "systems": [ { "_id": "1338",
当使用 $addToSet 时,如果我运行两次,它会输入重复的对象,但 name 和 key 的顺序相反。无论如何要避免这种情况,这样它只会增加一次? var categories = [{ na
我在 MongoDB 中更新文档时遇到问题,涉及使用 Pymongo 添加到列表和更新某些字段。 总而言之,我想: 向列表添加一个值。 更新一些字段。 使用单个更新语句。 我尝试了两种方法,但都不起作
http://www.mongodb.org/display/DOCS/Updating#Updating-%24addToSet 虽然文档中没有具体说明,但我推测此操作将始终将元素(如果唯一)添加到
如果字段不存在,使用 $addToSet 的数组更新是否会创建该字段?换句话说,如果下面一行中的 field2 不存在,是否会通过此命令创建: db.collection.update({id: },
假设我有一个文档,其中包含一个名为 Months 的数组。数组中的每个元素都有一个 int 字段,指示它引用的月份和年份 (yyyyMM),例如201612、201701等 每个此类元素还包含与该特定
我正在尝试更新嵌套在另一个散列下的数组对象。即 { name: "mike", instagram: { id: 3423, slug: 'mike', photos: [] } } 现在我想使用 $
我的基地里有一些文件: //example docs {"_id": "qwerty12345", "name": "Bob", "cards":["cardId1", "cardId2", "car
是否可以$addToSet并确定哪些项目已添加到集合中? 即$addToSet 标记到帖子并返回实际添加的内容 最佳答案 事实并非如此,而且没有任何一句话。您可以获得的最接近的是 findAndMod
我有以下更新查询: var where = 'answers.round_' + ans.round + '_' + ans.iteration Game.findByIdAndUpdate(game
我有一个userSchema,其中包含一个 id 和一个 friend 数组。 friend 数组实际上是另一个模式的数组,其中包含 id、性别和姓名,因此是一个 SubDocuments 数组。 v
我正在尝试对来自 mongoDB 集合(使用 nodeJS 驱动程序)的多个字段中的数组中的唯一值进行排序。 一个小数据集: [{ "_id" : "5c93db3dd018451640601
我需要通过使用变量来使用字段名称。我该怎么做? let variableName = 'cars'; Collection.update( { _id: id }, {
我有一个像下面这样的文档: { _id: "00112233", array: [ { _id: "potatoes",
我有以下文件: { "recordKey": "FOO", "channels": [{ "id": "CH1", "blocks": [] }, { "id": "CH2", "blo
我是一名优秀的程序员,十分优秀!