在MongoDB的文件说:
如果参数仅包含更新运算符表达式,则参数和参数的字段和值.此更新根据参数中的等于子句创建基本文档,然后应用参数中的更新表达式.
并且mgo文档说:
Upsert查找与提供的选择器文档匹配的单个文档,并根据更新文档对其进行修改.如果找不到与选择器匹配的文档,则将更新文档应用于选择器文档,并将结果插入到集合中.
但如果我像这样做一个upsert:
session.UpsertId(data.Code, data)
Run Code Online (Sandbox Code Playgroud)
我最终得到一个条目,它具有由mongodb自动生成的ObjectID,而不是data.Code.
这意味着UpsertId期望使用更新运算符格式化数据,并且您不能使用任意结构?或者我在这里失踪了什么?
钯.Mongo 2.4.9 mgo v2 golang go version devel + f613443bb13a
编辑:
这是我的意思的样本,使用Neil Lunn的示例代码:
package main
import (
"fmt"
"gopkg.in/mgo.v2"
// "gopkg.in/mgo.v2/bson"
)
type Person struct {
Code string
Name string
}
func main() {
session, err := mgo.Dial("admin:admin@localhost");
if err != nil {
fmt.Println("Error: ", err)
return
// panic(err)
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
c := session.DB("test").C("people")
var p = Person{
Code: "1234",
Name: "Bill",
}
_, …Run Code Online (Sandbox Code Playgroud) 下面的控制器使用表格和表格提供视图.该表的相关部分是:
<tr ng-repeat="obj in tab.col | filter:filterObj" ng-click="select(obj)" ng-class="isSelected(obj)">
如果单击一行,表单将显示obj的详细信息(其模型为tab.obj),您可以对其进行编辑.当用户修改表单字段中的obj时,表会适当地获取更新,但firebase不会获得任何更新,而是添加新对象(这是通过array.push(obj)完成的).
define(['app'], function(app) {
app.controller('LinksCtrl',['$scope', '$filter', '$http','angularFire','angularFireAuth', function($scope,$filter,$http, angularFire, angularFireAuth) {
$scope.links = {};
$scope.tabs = [];
var url = "https://<url>.firebaseio.com/links";
angularFireAuth.initialize(url, {scope: $scope, name: "user", path: "/"});
var promise = angularFire(url, $scope, 'links', {})
$scope.select = function (item) {
for(i in $scope.tabs) {
var tab = $scope.tabs[i];
if (tab.active) {
tab.obj = item;
if (tab.obj.selected) {
tab.obj.selected = ! tab.obj.selected;
} else {
tab.obj.selected = true;
// $scope.$apply();
}
} …Run Code Online (Sandbox Code Playgroud)